[C] Prüfen, ob Inhalt von Pointer auf Pointer existiert

mc_gulasch

Erfahrenes Mitglied
Aloah Forum,

stellt euch vor, ihr habt ein Telefonbuch, das als Einsprungadresse eine Zahl hat und Nummern durchsucht und euch den Namen zur Nummer gibt.Das Telefonbuch ist ein
Code:
unsigned int **telefonbuch
Das ganze läuft folgendermaßen ab (Bspnr: 78234)
1) Prüfe, ob es überhaupt Telefonnummern mit "7" am Anfang gibt
Code:
if (telefonbuch[7]!=0)
{
2) Falls es eine solche Nummer gibt, dann überprüfe alle Nummern der Reihe nach, ob irgendwas auf meine Nummer passt
Code:
/* 
*(telefonbuch[7]+n) = Zeiger auf eine Zeile der Nummernmatrix (in der die Folgeziffern nach der '7' eingetragen sind):
[1][2][3][4] (n=0)
[5][6][7][8] (n=1)
*(*(telefonbuch[7]+1)+j) = Die jeweiligen Digits der Zeile
(n=0): 
[1] (j=0)
[2] (j=1)
[3] (j=2)
[4] (j=3)
*/ 
while(*(*(telefonbuch[7]+n)+j)==bspnr[j])
{
richtig++;
}
}//von if
Hierbei ist 'n' ein unsigned int, das die jeweiligen Einträge (mit '7' am Anfang) durchzählen soll. Jetzt hab ich aber folgendes Problem:
Wenn ich weitermache, es aber meine gesuchte Nummer tatsächlich nicht gibt, dann schmeisst mein 'n' irgendwann meine Pointer auf einen NULL-Pointer. Ich würde gerne etwas machen nach der while - Schleife wie:
Code:
if(richtig!=strlen(bspnr))
{
 n++;
 if (*(telefonbuch[7]+n)==NULL) exit(0);
}
Anmerkung:
Ich weiß, dass man ein solches "Telefonbuch" auch anders machen kann, aber es dient hier nur als Beispiel meines Problems. Ich programmiere tatsächlich kein solches Telefonbuch. :p aber die Verschachtelungen und Arbeitsweise des obigen Codes entspricht meinem Programm.

Danke für jegliche Unterstützung!


//edit:
Noch was wichtiges:
Das telefonbuch wird mit
Code:
unsigned int **telefonbuch={0}
initialisiert, so dass sofort herausgefunden werden kann, ob ein Eintrag für eine bestimmte Zahl existiert (indem er !=0 ist und ein Adresse beinhaltet) oder nicht.
//edit
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
Hi.
mc_gulasch hat gesagt.:
Noch was wichtiges:
Das telefonbuch wird mit
Code:
unsigned int **telefonbuch={0}
initialisiert, so dass sofort herausgefunden werden kann, ob ein Eintrag für eine bestimmte Zahl existiert (indem er !=0 ist und ein Adresse beinhaltet) oder nicht.
//edit
Falsch. Du initialisierst da lediglich einen Zeiger mit dem Wert eines Nullzeigers. Das heißt das dieser Zeiger nirgendwo hinzeigt. Du kannst diesen Zeiger nicht dereferenzieren und auch nicht mit dem Index-Operator darauf zugreifen.

Statt deiner etwas merkwürdigen Schreibweise hättest du auch einfach
C:
unsigned int** telefonbuch = NULL;
schreiben können. Die geschweiften Klammern bewirken nichts.

Wenn du testen willst ob ein bestimmter Index gültig ist, mußt du zu allererst mal Speicher allozieren und auch entsprechend initialisieren:
C:
unsigned int** telefonbuch = calloc(10, sizeof(unsigned int*));

for (int i = 0; i < 10; ++i) {
  telefonbuch[i] = NULL;
}
Danach kannst du auch auf telefonbuch[7] zugreifen und wenn da noch kein Eintrag existiert ist der Zeiger ein Nullzeiger.
C:
if (telefonbuch[7] != NULL) ...

Gruß
 

mc_gulasch

Erfahrenes Mitglied
Danke mal wieder. Leider war das Problem dann doch etwas komplexer als hier geschildert, aber leichter zu lösen. Ich hatte ja den Speicher alloziert, sowohl
für meinen Index Array, als auch für die Matrix, auf die er zeigt. Ich umgeh
das Zeigen ins Nirvana damit, dass ich in der letzten Zeile der Tabelle einfach eine '0' am Anfang schreibe und das Problem ist gelöst.
Du initialisierst da lediglich einen Zeiger mit dem Wert eines Nullzeigers
Stimmt, soll er ja auch. Entweder es gibt einen Pointer auf etwas mit '7' oder nicht.

Cu und danke!
 

deepthroat

Erfahrenes Mitglied
mc_gulasch hat gesagt.:
Stimmt, soll er ja auch. Entweder es gibt einen Pointer auf etwas mit '7' oder nicht.
Ich glaube so ganz hast du es immer noch nicht verstanden. Oder ich habe dich irgendwie missverstanden.

Wenn du das so initialisierst kannst du nicht testen ob etwas mit '7' existiert.

Gruß
 

mc_gulasch

Erfahrenes Mitglied
Ich glaub fast, wir reden aneinander vorbei ;) Du versuchst mir glaub ich was klarzumachen, was ich nicht versteh und ich versuch dir mein Problem zu schildern, was mir aber irgendwie nicht gelingt. Ist ja auch egal, Problem gelöst.
Ich mache dennoch einen letzen Versuch, zu erklären, was ich meine:
Ich haben dieses Array mit 256 Plätzen. In meinem tatsächlichen Programm gehe ich vorher eine Art Wörterbuch durch und schaue, ob etwas mit 'a' existiert, schreibe dann in mein array
Code:
array[(unsigned int)'a']=1 (bzw. die Adresse für den 'a'-Block)
Dadurch ist es mir möglich über bspw. den array nachzuschauen ob an der Stelle (unsigned int)'a' ein Wert steht, oder nicht, was wiederum heisst: Existieren 'a'-Wörter in meinem Wörterbuch oder nicht.
Hoffentlich hab ich es geschafft einigermaßen verständlich zu schreiben.
Wünsche ein schönes Wochenede!