strlen Probleme

Gast #2432700
Lesenswert?

Wieso liefert strlen 0 zurück aber eine manuelle Suche nach dem 
Null-Terminator ist erfolgreich?
1
char* stringArray[5];
2
dllFunktion(&stringArray);    //Was genau darin passiert weiß ich leider nicht.
3
len = strlen(stringArray[1])
4
for (length=0; length<100; length++){
5
  if (stringArray[1][length] == '\0')
6
    break;
7
}
len = 0 aber length = 10

Ich kann es mir nicht erklären habt Ihr eine Idee?
Gast #2433417
Lesenswert?

Also abgesehen von dem fehlenden Semikolon läuft der Code genauso.

@Wiederspruch Euer Ehren:
Der erste Index von stringArray darf zwischen 0 und 4 liegen, ich werte 
alle aus, aber habe hier als Beispiel einfach mal den zweiten Wert 
gewählt.

@Klaus Wachtler:
Wo ist denn ein Leerzeichen zwischen ++?
Wenn ich das & entferne wird mir folgender Fehler angezeigt:
"Das Argument vom Typ 'char **' ist mit dem Parameter vom Typ 'char ***' 
inkompatibel"

Hoffe immer noch auf Eure Hilfe, denn ich verstehe es einfach nicht.
#2433433
Lesenswert?

Wg. des ++: da hatte ich wohl den falschen Browser....

Aber generell ist es schon so, daß man an einem Stück Quelltext, das nur 
einen Bruchteil des Problems zeigt und dann noch nicht mal das korrekt, 
keine Fehler suchen muß - das ist Zeitverschwendung.

Die Mühe, das Problem angemessen darzustellen, kann man sich schon 
machen, bevor man anderer Leute Zeit klaut.
Gast #2433456
Lesenswert?

@Klaus Wachtler
du beschwerst dich jetzt nicht ernsthaft dass du in deiner Freizeit 
(wahrscheinlich Arbeitszeit) anderen hilfst und dann dich dann auch noch 
beschwerst wenn du keine Lösung findest weil du das Problem nicht 
verstanden hast.
Und zweitens warum maßt du dir an, dass der dllaufruf falsch ist. Woher 
willst du denn wissen was für Parameter die Funktion braucht. Kannst du 
mir bitte sagen wo man den Kurs "Hellseherische Codeanalyse" machen 
kann?

@TO versuch mal mit einer Hilfsvariable

char* stringArray[5];
char* help;
dllFunktion(&stringArray);
help = stringArray[1];
len = strlen(help);
#2433464
Lesenswert?

Sebastian L. schrieb:

> Und zweitens warum maßt du dir an, dass der dllaufruf falsch ist. Woher
> willst du denn wissen was für Parameter die Funktion braucht.

Es ist in C ausgesprochen selten, dass ein solcher Parameter als
  char *(*p)[5]
deklariert wird. Hast schon recht, wirklich wissen kann er es nicht, 
aber alle Erfahrung sagt eben, dass bei &array ein Missverständnis über 
den Umgang mit Arrays und Pointern vorliegt.
#2433473
Lesenswert?

A. K. schrieb:
> Sebastian L. schrieb:
>
>> Und zweitens warum maßt du dir an, dass der dllaufruf falsch ist. Woher
>> willst du denn wissen was für Parameter die Funktion braucht.
>
> Es ist in C ausgesprochen selten, dass ein solcher Parameter als
>   char *(*p)[5]
> deklariert wird. Hast schon recht, wirklich wissen kann er es nicht,
> aber alle Erfahrung sagt eben, dass bei &array ein Missverständnis über
> den Umgang mit Arrays und Pointern vorliegt.


eben. So wie das da verwendet wird, liegt kein Grund dafür vor.

Welche Information hast du denn über die DLL-Funktion. Ich denke nämlich 
tatsächlich, dass die falsch verwendet wird.

Ansonsten: stringArray mit dem Debugger mal auf Byteebene untersuchen. 
(Daten ansehen)
#2433525
Lesenswert?

> Wenn ich das & entferne wird mir folgender Fehler angezeigt:
> "Das Argument vom Typ 'char **' ist mit dem Parameter vom Typ
> 'char ***' inkompatibel"

Also will die Funktion einen char*** haben.

Ich rate jetzt mal ins Blaue.
Normal kommt so etwas nur dann vor, wenn die Funktion selber sowohl das 
Pointer Array als auch die Strings anlegt.

Mit einem

  char* Strings[5];

erlaubst du ihm das aber nicht und hast dich nur syntaktisch irgendwie 
aus der Affäre gezogen und den Code soweit verändert, dass der Compiler 
zufrieden gestellt ist. Falsch bleibt es trotzdem.

Wenn ich recht habe, dann wird diese Funktion so benutzt:
1
  char** Strings;
2

3
  dllFunc( &Strings );
4

5
  char* Loop = *Strings;
6
  while( Loop ) {
7
    printf( "%d %s\n", strlen( Loop ), Loop );
8
    Loop++;
9
  }
10

11
  // und alles wieder löschen, sofern es keine Freigabefunktion in
12
  // der DLL dafür gibt. Wenn es eine gibt, dann ist natürlich diese
13
  // zu benutzen!
14
  Loop = *Strings;
15
  while( Loop ) {
16
    free( Loop );    // oder in C++   delete [] Loop;
17
    Loop++;
18
  }
19
  free( Strings );   // oder in C++  delete [] Strings;

Wie gesagt: Aus der Erfahrung heraus würde ich das für die 
wahrscheinlichste Variante halten, warum die Funktion einen char*** 
haben will. Kann natürlich alles auch ganz anders sein. Daher: Doku 
studieren!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren