[C] Konflikt zwischen Pointer und Integer Wert?!

SvenK

Grünschnabel
Hi,
ich muss in einer aktuellen Informatik Übung einen binären Baum der Struktur
Code:
// Festlegung der Struktur jedes Datenelementes
struct nobel
{
  char **names;     // Strings mit den Namen der Nobelpreistraeger
  int year;         // Jahr
  struct nobel *l;  // Zeiger aufs nächste Listenelement links
  struct nobel *r;  // Zeiger aufs nächste Listenelement rechts
};
typedef struct nobel nobel_t,*nobel_p;  // Typendefinition der Struktur
erstellen.

Nun soll eine Funktion des Programms sein, eine Jahreszahl einzulesen und sämtliche Nobelpreisträger dieses Jahres auszugeben. Ich hab dafür folgende Funktion geschrieben:
Code:
void datensatz_suchen(nobel_p pPosition)
{
  if(pPosition!=NULL)
  {
    if(pPosition->year == suche)
    {
      fprintf(stdout,"Jahr: %d\n",pPosition->year);
      fprintf(stdout,"Namen: ...\n");
    }
    else
    {
      if(pPosition->year < suche)
      {
        datensatz_suchen(pPosition->l);
      }
      else
      {
        datensatz_suchen(pPosition->r);
      }
    }
  }
}
Leider gibt mir der Compiler folgenden Fehler aus:
Warning: In function 'datensatz_suchen':
Warning: comparision between pointer and integer
Die Variable year ist dabei vom Typ int und in ihr steht die zu suchenende Jahreszahl.

Woran könnte dieser Fehler liegen? Ich häng mal noch die komplette C Datei als Anhang an.
 

Anhänge

suche ist ein array und damit ein pointer (siehe Zeile 28 in main.c).

Ihr wolltet wohl erst das Jahr Ziffernweise eingeben und dann in eine Integer umwandeln - das habt ihr wohl vergessen und nur halb umgesetzt.
 
Zuletzt bearbeitet:
Erstmal als Anmerkung: Das kann man wesentlich effizienter lösen, wenn man keinen Baum benutzt, naja ein Baum ist es sowieso nicht, weil nix verzweigt wird, ist vollkommen liniear (nach 1950 kommt schließlich nicht 1951a und 1951b sondern nur 1951). Deswegen würde ich die blöden Zeiger aus der Struktur schmeißen und lieber ein Array aus diesen Structs erstellen, dass sortiert wird (nach Jahr). Dann kannst du auch ganz leicht auf das entsprechende Jahr arithmetisch zugreifen.
Zu deiner eigentlichen Frage: Was ist denn suche vom Typ? Wird vermutlich ein pointer sein, da year ja ein int ist. Kannst du zurechtcasten:

Code:
if(pPosition->year == (int)suche)

Ich rate allerdings davon ab, wenn du nicht weißt, was du da tust (und vor allem, warum ist suche ein Pointer?).
 
Nachdem das ein Übungsblatt ist werden sie mit der Struktur keine Wahl haben. Und casten hilft hier nix - Logikfehler. Entweder int suche[4] zu einer echten int machen oder umwandeln und mit dem umgewandelten Wert suchen, oder Datenstruktur anpassen.
 
Vielen Dank. Es lag einfach daran, dass - wie es auch von euch angesprochen wurde - ich vergessen habe die [4] hinter "suche" wegzunehmen.

Vielen Dank. :)
 
Noch eine weitere Frage zum Programm:

Die Aufgabenstellung lautet eine Textdatei deren Zeilen folgendes Format haben können
# Jahr Name1, Name2, ...

1978 Pyotr Kapitsa, Arno Penzias, Robert Woodrow Wilson
auszulesen und in einen binären Baum zu speichern. Da wir nicht wissen, wie viele Nobelpreisträger es in jedem Jahr haben, sollen wir **names verwenden um jeweils die Namen zu speichern. Aber ich hab absolut keinen Plan wie ich das realisieren soll. Hat vielleicht einer ne Ahnung wie man da vorgeht?

Wens interessiert oder wer aus meinen Erklärungen nicht schlau wird, das hier ist der Übungszettel: http://ag47.informatik.uni-bremen.de/lehre/gdi/uebung009.pdf
 
Also, erstmal liest du die ganze Datei in einen Puffer.
Dann bastelst du dir eine Funktion, die den Puffer Schritt für Schritt in Zeilen zerlegt (und am besten die Zeile als char* zurückliefert). Die ersten Vier bytes der Zeile werden mit atoi in einen Integer (Jahr) umgewandelt und in das aktuelle struct-Element eingetragen.
Dann parst du die erhaltene Zeile nach dem Zeichen , (Komma), das ja immer die Trennung zwischen zwei Trägern angibt. Die Anzahl der Kommas plus 1 ergibt die Anzahl der benötigten char* Puffer. Dann kannst du zunächst das Array initialisieren:

Code:
char *line = GetLine(...);
int anzahlkommas = GetAnzahlKommas(line);

pPosition->names = (char**)malloc(sizeof(char*)*anzahlkommas+1);

Als nächstes wird jeder Nobelpreisträger geparst. Du muss rauskriegen wie lang er ist um den Speicher zu reservieren, du zählst also vom ersten Byte des Namens bis zum Komma durch (erhälst n bytes) und reservierst diese n bytes an der aktuellen Stelle des char*-Arrays also (ein Positionszähler muss auch noch in die struct, sonst geht's nicht!):

Code:
int laengenamen = GetAktuelleNamenLaenge(...);

pPosition->names[pPosition->position] = (char*)malloc(sizeof(char)*laengenamen+1);
memset(pPosition->names[pPosition->position],0,laengenamen+1);
//Namen kopieren

pPosition->position++;

Dann kannst du den Namen byte für byte kopieren.

Am Ende des ganzen musst du noch alles mit free wieder auflösen:

Code:
for (int i = 0; i < pPosition->position; i++)
{
  free(pPosition->names[i]);
}
free(pPosition->names);

(Sorry, für den vielen Pseudocode, aber du sollst ja auch noch deinen Spaß haben ;). Auf jeden Fall kriegst du auf diese Weise die Speicherverarbeitung in den Griff.)
 
Zuletzt bearbeitet:
Zurück