Forum: PC-Programmierung strlen Probleme


von Manuel (Gast)


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?

: Verschoben durch Admin
von Wiederspruch Euer Ehren (Gast)


Lesenswert?

Manuel schrieb:
> char* stringArray[5];

Manuel schrieb:
> stringArray[1][length]

von ausfüllen (Gast)


Lesenswert?

Wiederspruch Euer Ehren schrieb:
> Manuel schrieb:
>> char* stringArray[5];
>
> Manuel schrieb:
>> stringArray[1][length]

Passt doch, Stern beachten!

von Wiederspruch Euer Ehren (Gast) (Gast)


Lesenswert?

ausfüllen schrieb:
> Passt doch, Stern beachten!
Grummer, grummel, grummel... ;-)

OK 2. Versuch:
Müsste es dann nicht
1
  if (stringArray[0][length] == '\0')
heissen?

von Klaus W. (mfgkw)


Lesenswert?

erstens ist das & beim Aufruf von dllFunction falsch, zweitens schreibt 
man ++ ohne Leerzeichen dazwischen.
Solange du hier irgendwas als Quelltext zeigst, was nie gelaufen ist, 
kann man lange rätseln.
Copy&paste ist zu schwer?

von Klaus W. (mfgkw)


Lesenswert?

Ein Semikolon fehlt übrigens auch.

von Manuel (Gast)


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.

von Klaus W. (mfgkw)


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.

von Sebastian L. (Gast)


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);

von (prx) A. K. (prx)


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.

von Karl H. (kbuchegg)


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)

von Sebastian L. (Gast)


Lesenswert?

was spräche dann dagegen das ganz mal auszugeben.
dann wird man doch sehen was drin ist.

for(int i = 0;i<5i++)
{
  printf("%s",stringArray[i]);
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sebastian L. schrieb:
> was spräche dann dagegen das ganz mal auszugeben.
> dann wird man doch sehen was drin ist.

Das wäre zu einfach.


BTW: Dir fehlt ein Semikolon zwischen 5 und i, aber das dürfte nur ein 
Tippfehler sein.

  for (int i = 0; i < 5; i++)

von Sebastian L. (Gast)


Lesenswert?

Warum wäre das zu einfach :)

ja es ist ein tippfehler;

von Karl H. (kbuchegg)


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!

von Manuel (Gast)


Lesenswert?

@Karl Heinz Buchegger:

Vielen Dank mit deinem Beispiel passt es nun, du hattest recht bzgl. der 
Parameterübergabe!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.