Forum: Mikrocontroller und Digitale Elektronik Pointer übergabe führt zum Absturz?


von Steffen W. (Gast)


Lesenswert?

Moin,

kurze Frage. Was mache ich falsch?

Wenn ich den Pointer übergebe, stürzt das Programm ab.
1
char *inBuff = "+ADDR:1234:56:abcdef";

Mache ich es via. Array, klappt es.
1
char inBuff[] = "+ADDR:1234:56:abcdef";
1
int8_t srchCmd(char *inBuff, char *srchCmd)
2
{
3
     char *cmdBeginn   = NULL;
4
     char *cmdEnd       = NULL;
5
     char *rawData    = NULL;    
6
   char cmdStrLen      = strlen(srchCmd);
7
   char inBuffStrLen  = strlen(inBuff);
8
   char rawData_    = 0;
9
10
   if(inBuffStrLen < cmdStrLen)
11
   return -1;
12
13
   /*
14
   *  how much raw data we will received?
15
   */
16
   rawData = strchr(srchCmd,'x');   
17
   if(rawData != NULL)
18
   {
19
     while(*rawData++ != NULL){rawData_++;}
20
   }

von Walter S. (avatar)


Lesenswert?

das Programm kann nicht abstürzen, das Unterprogramm wird nirgends 
aufgerufen
Ansonsten liegt der String vielleicht im ROM?
Welcher Prozessor/Compiler?

von Steffen W. (Gast)


Lesenswert?

Hier noch mal komplett.
1
int8_t srchCmd(char *inBuff, char *srchCmd)
2
{
3
     char *cmdBeginn   = NULL;
4
     char *cmdEnd       = NULL;
5
     char *rawData    = NULL;    
6
   char cmdStrLen      = strlen(srchCmd);
7
   char inBuffStrLen  = strlen(inBuff);
8
   char rawData_    = 0;
9
10
   if(inBuffStrLen < cmdStrLen)
11
   return -1;
12
13
   /*
14
   *  how much raw data we will received?
15
   */
16
   rawData = strchr(srchCmd,'x');   
17
   if(rawData != NULL)
18
   {
19
     while(*rawData++ == 'x'){rawData_++;}
20
   }
21
      
22
     /*
23
     *    search first character from our string without nx
24
     */
25
   char *cmdBeginn_ = malloc(sizeof(char)*cmdStrLen);
26
   strcpy(cmdBeginn_,srchCmd);
27
     
28
     /*
29
     *  mask the nx out
30
     */ 
31
   cmdBeginn_ += (cmdStrLen-rawData_);
32
     *cmdBeginn_ = '\0';
33
     cmdBeginn_ -= (cmdStrLen-rawData_);
34
        
35
     cmdBeginn = strstr(inBuff,cmdBeginn_);
36
   if(cmdBeginn == NULL)
37
     return -2;
38
     
39
     /*
40
     *    search last character from our string
41
     */     
42
     cmdEnd = strrchr(cmdBeginn,cmdBeginn_[cmdStrLen-rawData_]);
43
     if(cmdEnd == NULL)
44
     return -3;
45
46
     /*
47
     *    terminate end of serached string
48
     */
49
     cmdBeginn+=cmdStrLen;
50
     *cmdBeginn = '\0';
51
     cmdBeginn-=cmdStrLen;
52
53
     /*
54
     *    copy the command to "inBuff"
55
     */
56
     strcpy(inBuff,cmdBeginn);
57
58
     return 0;
59
}
60
61
int main(int argc, char *argv[]){
62
63
  char *inBuff = "+ADDR:1234:56:abcdef";  
64
  
65
  printf("Function Result.: %d\r\n",srchCmd(inBuff,"+ADDR:xxxxxxxxxxxxxx"));
66
  
67
  return 0;
68
}

von Sebastian V. (sebi_s)


Lesenswert?

Ist die Funktion so vollständig? Es fehlt wenigstens die letzte 
schließende Klammer. Überprüfe mal ob inBuf in der Funktion nicht 
verändert wird und wenn nicht mache sie const. Wenn du einen Pointer mit 
einem String Literal initialisierst dann zeigt der Pointer auf einen 
const String und dementsprechend sollte der Pointer hier ebenfalls const 
sein.

Ansonsten zeig mal wie du die Funktion aufrufst mit beiden Varianten.

Edit: Wie schon vermutet schreibst du in deinen Pointer der eigentlich 
const sein müsste:
1
strcpy(inBuff,cmdBeginn);

von DanVet (Gast)


Lesenswert?

Bei der Zeigervariante liegt dein String eventuell im ROM/Flash.
Bei der Arrayvariante liegt dein String im Array, also RAM.

Je nach Zielsystem kann nicht einfach auf das ROM/Flash zugegriffen 
werden.
Welches ist dein Zielsystem?

Dein Beispiel mit einem PC-Programm umgesetzt funktioniert :-)

von Steffen W. (Gast)


Lesenswert?

DanVet schrieb:
> Bei der Zeigervariante liegt dein String eventuell im ROM/Flash.
> Bei der Arrayvariante liegt dein String im Array, also RAM.
>
> Je nach Zielsystem kann nicht einfach auf das ROM/Flash zugegriffen
> werden.
> Welches ist dein Zielsystem?
>
> Dein Beispiel mit einem PC-Programm umgesetzt funktioniert :-)

Ich nutze es auf dem PC. DevC++

von Steffen W. (Gast)


Lesenswert?

Ihr hattet Recht.
Wenn ich vorher für den Pointer Speicher reserviere, klappt es!
1
int main(int argc, char *argv[]){
2
3
4
  char *inBuff = malloc(sizeof(char)*50);
5
  strcpy(inBuff,"+ADDR:1234:56:abcdef");
6
  
7
  printf("Function Result.: %d\r\n",srchCmd(inBuff,"+ADDR:xxxxxxxxxxxxxx"));
8
  printf(getBlthAddr(inBuff));
9
  
10
  return 0;
11
}

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Steffen W. schrieb:
> char *cmdBeginn_ = malloc(sizeof(char)*cmdStrLen);
>    strcpy(cmdBeginn_,srchCmd);

Da ist kein Platz für die 0-Terminierung ... Du brauchst 1 Byte mehr als 
der String lang ist.

Sicherheitshalber sollte man eh kein strcpy verwenden sondern strncpy

von fop (Gast)


Lesenswert?

Mal in's blaue geraten : Dein C-Compiler Bildet aus den ASCII-Werten von 
+ADD
eine 32-bittige Zahl und castet sie auf eine Speicheradresse. Auf diese 
Adresse zeigt dann Dein Pointer. Das ist natürlich gequirlter Quatsch 
und gar nicht, was Du willst.

von Konstante (Gast)


Lesenswert?

Steffen W. schrieb:
> int8_t srchCmd(char *inBuff, char *srchCmd)

besser
1
... srchCmd(char *inBuff, const char* const srchCmd)...
dann sieht man, was man ändern darf und was nicht.

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.