mikrocontroller.net

Forum: PC-Programmierung C Programmierung Array/Funktion/pointer


Autor: Rejocktana Morfeo (rejocktana_m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgenden Code geschrieben um Daten aus einem .TXT-File mittels 
zu lesen.
#include <stdio.h>
#include <stdlib.h>

void read_from_file(char *result, int lenght_result)
{
    
    FILE *ptr_file;
    char buf[22];
    char buf_old[sizeof(buf)];
    char candata_needed[4]; 
    //while(1){
        ptr_file =fopen("/home/pi/probe.txt","r");
        if (!ptr_file){
            return 1;
        }
        if (fgets(buf,sizeof(buf), ptr_file)!=NULL){

            if(memcmp(buf, buf_old, sizeof(buf)))
            {
                
                memcpy(candata_needed, buf + 17, sizeof(buf));
                strncpy(result, candata_needed, lenght_result);
                
                memcpy(buf_old, buf, sizeof(buf));
            }
        }
        
        fclose(ptr_file); 
}


int main()
{
        int i;
        int size=4;
        char *candata = malloc(size);   
        char candata_gen [4];        
    while(1){
       
        read_from_file(candata, size);
    memcpy(candata_gen, candata, sizeo(candata));
       
        printf("candata: %s\n", candata); 
    printf("candata_gen: %s\n", candata_gen);
        
    }
    free(candata);        
    return 0;
}

Die Datei enthält Hex. Zahlen und ich speichere nur 4 davon für meine 
Main-Funktion.

Die Daten sollen angezeigt werden und das gelingt mir auch. Nur bekomme 
ich zwei unterschiedliche Daten angezeigt:
Die Variabel
candata
 liefert genau 4 Hex. Zahlen z.B. 0xFF89. Ich speichere diesen Wert mit 
Hilfe der Funktion
memcpy(candata_gen, candata, sizeo(candata));
 in ein anderes Array und bekomme allerdings beim Anzeigen die ersten 3 
Hex. Zahlen richtig und das letztes erscheint immer als Symbole (z.B. 
0xFF8§). Ich bin neu in der C Programmierung und wollte wissen, wie ich 
es hinkriegen kann, die Daten richtig speichern und anzeigen kann.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Hm, die Beschreibung ist etwas wirr und der Quelltext so nicht 
lauffähig.
Bevor jetzt wieder jeder wild herumrätselt, wäre vielleicht eine lesbare 
und verständliche Beschreibung förderlich, und ein lauffähiges Programm.

Nebenbei: wenn man sizeof auf einen Zeiger anwendet, bekommt man die 
Größe des Zeigers, nicht die Größe eines eventuell dafür allokierten 
Feldes.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abgesehen von einem falsch geschriebenen sizeof, wodurch das Ganze nicht 
kompiliert:

Du bekommst mehrere Warnungen vom Compiler. Die sollte man einfach mal 
nicht ignorieren, sondern sie entsprechend abarbeiten.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sizeof(candata) liefert nicht den gewünschten Wert.
(Der mag hier zufällig richtig sein)

printf erwartet bei %s einen Zeiger auf einen Nullterminiertes 
char-Array.
Das ist, durch das memcpy, auch nicht unbedingt gegeben.



Bei memcpy(candata_needed, buf + 17, sizeof(buf)); gibt es auch Müll, da 
candata_needed nur 4 Byte groß ist, du aber 22 Byte kopierst.

: Bearbeitet durch User
Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rejocktana M. schrieb:
> char candata_needed[4];

Wieviele Zeichen passen da wohl rein, wenn man das als String benutzt?

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.