www.mikrocontroller.net

Forum: PC-Programmierung Zeigerdaten in ein Array schreiben


Autor: TheBeginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

bräuchte mal kurz einen Tipp. Rufe eine Funktion auf die mir einen 
String zurückgeben soll, mache das folgendermaßen,

char *connection_establishment(void)
{
  char id_request="ID request";
  char *pointer= (char*)malloc(strlen(id_request)+1);
  strcpy(pointer,id_request);
  return pointer;
}

möchte dann jedes einzehlne Zeichen in ein Array schreiben,

...
test_pointer=connection_establishment;
for(tx_cnt=0;tx_cnt<x;tx_cnt++)   //x, maximale Größe des Strings
{
txbuf[tx_cnt]=test_pointer+tx_cnt; //ins Array schreiben
}
free(test_pointer); //leeren des speichers
...


wollte also zuerst Werte an den test_pointer übergenen, und diese dann 
in ein Array schreiben, zeichenweise. D.h. erste Stelle im Array kriegt 
das erste Zeichen des Strings zugewiesen.

Leider bekomme ich Fehler,

test_pointer=connection_establishment; // assignment from incompatible 
pointer type

char *pointer= (char*)malloc(strlen(id_request)+1); // passing argument 
1 of 'strlen' makes pointer from integer without a cast

weiss eventuell jemand den Grund?

Danke & Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TheBeginner schrieb:

> char *connection_establishment(void)
> {
>   char id_request="ID request";
>   char *pointer= (char*)malloc(strlen(id_request)+1);
>   strcpy(pointer,id_request);
>   return pointer;
> }

keine so wahnsinnig gute Idee.
Siehe
http://www.mikrocontroller.net/articles/FAQ#wie_sc...


> ...
> test_pointer=connection_establishment;

das ist kein Funktionsaufruf.

> for(tx_cnt=0;tx_cnt<x;tx_cnt++)   //x, maximale Größe des Strings

und wer sagt dir, dass der Rückgabestring auch tatsächlich so gross war?
Wenn schon dann müsstest du hier das Minium aus x und strlen vom 
erhaltenen String nehmen.

> {
> txbuf[tx_cnt]=test_pointer+tx_cnt; //ins Array schreiben

wenn du Arrayzugriff machst, dann mach auch Arrayzugriff

    txbuf[tx_cnt] = test_pointer[tx_cnt];
> }
> free(test_pointer); //leeren des speichers
> ...


aber warum so kompliziert?
  test_pointer = connection_establishment();
  strcpy( txbuf, test_pointer );
  free( test_pointer );

noch besser, wenn an dieser Stelle txbuf in seiner Arrayform verfügbar 
ist (und nicht einfach nur ein Pointer ist)
  test_pointer = connection_establishment();
  strncpy( txbuf, test_pointer, sizeof( txbuf ) );
  txbuf[sizeof(txbuf)-1] = '\0';
  free( test_pointer );

Aber eigentlich ist auch das ziemlicher Müll.
Die beste Methode ist es meistens, den Buffer in die Funktion 
connection_establishment hinein zu übergeben (zusammen mit seiner 
Länge), und die Funktion soll ihre Ergüsse gleich im Buffer ablegen.
Dann braucht man nicht allokieren und großartig herumkopieren.


> Leider bekomme ich Fehler,
>
> test_pointer=connection_establishment; // assignment from incompatible
> pointer type

logo. Du machst hier keinen Funktionsaufruf

>
> char *pointer= (char*)malloc(strlen(id_request)+1); // passing argument
> 1 of 'strlen' makes pointer from integer without a cast


   char id_request="ID request";
   char *pointer= (char*)malloc(strlen(id_request)+1);


id_request ist ein einzelner Character. Einer!
Wie soll denn da ein kompletter String reinpassen?
char *connection_establishment(void)
{
  char id_request[] = "ID request";

  char *pointer= (char*)malloc(strlen(id_request)+1);
  strcpy(pointer,id_request);
  return pointer;
}

oder
char *connection_establishment(void)
{
  char* id_request = "ID request";
  char *pointer= (char*)malloc(strlen(id_request)+1);
  strcpy(pointer,id_request);
  return pointer;
}


Aber egal wie du es machst: Du brauchst ein C-Buch!

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TheBeginner schrieb:
> test_pointer=connection_establishment; // assignment from incompatible
> pointer type

um dazu etwas zu sagen, müsste man wissen, wie test_pointer definiert 
ist?

TheBeginner schrieb:
>  char id_request="ID request";
> ...
> char *pointer= (char*)malloc(strlen(id_request)+1); // passing argument
> 1 of 'strlen' makes pointer from integer without a cast

das soll wohl
 char *id_request="ID request";
heißen statt
 char id_request="ID request";
?

und ja, man darf C-Quelltext in
[c]
...
[/c]
einschließen, dann kann man es ordentlich lesen.

Autor: TheBeginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe,

hatte mich da verschriben mit "id_request". Und dem x habe ich die Länge 
des Strings zugewiesen.

Autor: XXX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Dann zeig doch mal dein richtiges Programm und nicht
irgendwas falsch abgeschriebenes.

Gruß
Joachim

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TheBeginner schrieb:
> Danke für die Hilfe,
>
> hatte mich da verschriben mit "id_request". Und dem x habe ich die Länge
> des Strings zugewiesen.


Jetzt schreibst du 100 mal die Ergänzung zur Grundregel römisch 3 der 
Programmierung:

Ich soll meinen Variablen sinnvolle Namen geben!


x ist kein sinnvoller Name einer Variablen, die eine Stringlänge 
enthält.

Autor: TheBeginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schaut jetzt alles folgendermaßen aus,

test_pointer=connection_establishment();
            string_length=strlen(test_pointer);

do
{
                  txbuf[tx_cnt]=test_pointer[tx_cnt];
tx_cnt++;
                  
}while(tx_cnt<string_length);

free(test_pointer);


Gruß

Autor: TheBeginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wobei ich sagen muss, dass die Arrays den Speicher ungemein fressen.
Bei meinem Atmega acht komme ich langsam ins Schwitzen!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TheBeginner schrieb:
> schaut jetzt alles folgendermaßen aus,
>
>
> 
> test_pointer=connection_establishment();
>             string_length=strlen(test_pointer);
> 
> do
> {
>                   txbuf[tx_cnt]=test_pointer[tx_cnt];
> tx_cnt++;
> 
> }while(tx_cnt<string_length);
> 
> free(test_pointer);
> 
> 
>

so wärs einfacher/schneller (wenn auch nicht sicherer)
  test_pointer = connection_establishment();
  strcpy( txbuf, test_pointer );
  free( test_pointer );

benutz doch die Stringfunktionen! Dafür sind sie da, dass man nicht 
selber immer wieder Schleifen Konstrukte über Strings machen muss.

Aber wie gesagt (bzw. in der FAQ verlinkt): Eigentlich ist die ganze 
Idee der Rückgabe eines Strings aus einer Funktion indem man einen 
Buffer allokiert schon nicht besonders gut.

> wobei ich sagen muss, dass die Arrays den Speicher ungemein fressen.
> Bei meinem Atmega acht komme ich langsam ins Schwitzen!

Auf einem Mega8 möchtest du malloc eigentlich gar nicht benutzen.
Du solltest ernsthaft darüber nachdenken, Stringbuffer die du brauchst 
einmal zu allokieren und die dann in Funktionen hinein zu übergeben auf 
dass die Funktionen die Buffer gleich direkt befüllen anstatt 
haufenweise weiter Buffer zu allokieren. Dein Speicherverbrauch wird es 
dir danken, genauso wie die Laufzeit.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TheBeginner schrieb:
> Bei meinem Atmega

Karl heinz Buchegger schrieb:
> Auf einem Mega8

Das Ganze in der Rubrik PC-Programmierung.

Und x kommt doch nirgends vor, oder bin ich blind?
Reden wir hier über abwesende Programme?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> TheBeginner schrieb:
>> Bei meinem Atmega
>
> Karl heinz Buchegger schrieb:
>> Auf einem Mega8
>
> Das Ganze in der Rubrik PC-Programmierung.

Drum hab ich mich auch vorher nicht getraut, etwas zum malloc zu sagen 
:-)

>
> Und x kommt doch nirgends vor, oder bin ich blind?

Das hat er gelernt :-)
Er hat das x umbenannt auf string_length, was ja grundsätzlich gut ist.

Wollen wir nur hoffen, dass sein txt_cnt auch irgendwo auf 0 gesetzt 
wird :-) Sonst wartet schon der nächste Fehler, den er nicht hätte, wenn 
er einfach strcpy bzw. strncpy benutzen würde. Aber wem sag ich das. 
Manchmal ist es wirklich frustrierend.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Standard-Tip:
Erst auf dem PC C lernen!
Das macht viel weniger Ärger (und immer noch genug) als auf einem MC.

Gibt es eigentlich schon die Standardantworten zum Anklicken
neben dem Textfeld hier?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.