Forum: PC-Programmierung Eclipse C++ Raspberry Pi


von johnPI (Gast)


Lesenswert?

Hallo zusammen,

ich programmiere meinen RPi über Eclipse C++ Remote.
Das Debugging meines Codes funktioniert ohne Probleme.

Ich möchte gerne Sensordaten loggen bzw. in einem File /media/X00.csv 
abspeichern. Durch durch drücken eines Buttoms wird die nächste Messung 
mit /media/X01.csv usw. abgespeichert.

Ich mache das folgendermaßen:
1
char filename[]=  "/media/X00.csv";
2
3
4
5
int main (void){
6
7
FILE * myFile_1;
8
9
for (uint8_t x = 0; x < 100; x++) {
10
      
11
    filename[8] =  x/10 + '0';
12
    filename[9] =  x%10 + '0';
13
14
15
16
                std::ifstream FileTest(filename);
17
18
19
               if(FileTest){
20
21
22
                   myFile_1 = fopen(filename,"w");
23
24
                break; 
25
26
                  }
27
                }
28
    
29
                  
30
...Vario wird berechnet...
31
32
     fprintf(myFile_1, "%s, %d\n","Vario: ", Vario);
33
     fclose(myFile_1);


bei fprintf(...) bricht das Programm ab: "No source available for 
"vfprintf() at 0x76c9182c""


An einem IOT2040 von Siemens hat das ohne Probleme funktioniert.
Was mache ich beim Raspberry falsch?

Danke!

von TestX (Gast)


Lesenswert?

hast du die entsprechenden libs gelinkt ?
wie sieht dein make aus ?

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hi John,

johnPI schrieb:

> Was mache ich beim Raspberry falsch?

soll jetzt jeder von uns, Deinen Quelltext kopieren und erst einmal 
formatieren, damit man ihn lesen kann? Du möchtest Hilfe? Dann hilf uns, 
Dir zu helfen!

Ansonsten scheinst Du zwei mal die Datei mit dem Namen filename zu 
öffnen. Einmal lesender weise und einmal dann zum schreiben. Das soll 
sicherlich so etwas wie ein Test sein, ob die Datei vorhanden ist. Lass 
das einfach und öffne die Datei einfach zum schreiben und prüfe das 
Ergebnis dieser Operation.

mfg Torsten

von Oliver S. (oliverso)


Lesenswert?

johnPI schrieb:
> bei fprintf(...) bricht das Programm ab: "No source available for
> "vfprintf() at 0x76c9182c""

Wann kommt die Fehlermeldung?

Das klingt nach einer Meldung vom gdb beim debuggen, und hat erst mal 
nichts mit dem Programm zu tun.

Oliver

von johnPI (Gast)


Lesenswert?

Das debuggen funktioniert fehlerfrei.
Programm funktioniert ebenfalls fehlerfrei sobald ich " 
fprintf(myFile_1, "%s, %d\n","Vario: ", Vario);
und  fclose(myFile_1);" ausblende.

Fehlermeldung kommt sobald er fprintf(...) oder fclose(...) ausführen 
will.


Entsppechende libs:
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <fstream>
#include <unistd.h>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
...

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

johnPI schrieb:

> Fehlermeldung kommt sobald er fprintf(...) oder fclose(...) ausführen
> will.

Mit anderen Worten: Sobald Du versuchst, auf die Datei zuzugreifen. Hast 
Du den das Ergebnis von fopen() geprüft?

von johnPI (Gast)


Lesenswert?

1
if (file == NULL) {
2
     perror("Error opening file: ");
3
}

habe ich einmal in der if Schleife "if(FileTest)" eingefügt und dann 
noch einmal ausserhalb der For Schleife "for (uint8_t x = 0; x < 100; 
x++)"

Die If Schleife wird nicht ausgeführt.
Bei der zweiten Abfrage kommt das kein File vorhanden ist.

Ich frage mich wieso das bisher mit dem IOT2040 funktioniert hat :/

von Dr. Sommer (Gast)


Lesenswert?

johnPI schrieb:
> if Schleife

http://if-schleife.de/

Argh!

Reduzier den Code mal auf das allernötigste, was kompilierbar(!!) ist 
und das beschriebene Problem hat. Den zeigst du uns dann mal 
vollständig.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

johnPI schrieb:
> habe ich einmal in der if Schleife "if(FileTest)" eingefügt und dann
> noch einmal ausserhalb der For Schleife "for (uint8_t x = 0; x < 100;
> x++)"

Diese Abfrage solltest Du exakt einmal machen. Genau dann, wenn der Du 
Variablen einen Wert zuweist. In C++ ist es auch nicht nötig (und in C99 
auch nicht) eine Variable am Anfang der Funktion zu deklarieren. Damit 
kannst Du die Variable als Konstate deklarieren und sofort 
initialisieren:
1
    FILE* const vario_file = fopen( filename );
2
3
    if ( vario_file )
4
        ....

> Die If Schleife wird nicht ausgeführt.

Was auch immer eine "If Schleife" ist...

> Ich frage mich wieso das bisher mit dem IOT2040 funktioniert hat :/

Nun, dort scheint es offensichtlich möglich zu sein, eine Datei zwei mal 
zu öffnen und unterschiedliche Modies dabei anzugeben.

von Tom (Gast)


Lesenswert?

Warum mischt man überhaupt file streams und FILE*?

von johnPI (Gast)


Lesenswert?

musste die Zugriffsrechte von /media ändern. Das war schon alles.
Der IOT hat kein sudo Befehl.
Eig. sollte "perror" das auch anzeigen...

Trotzdem danke für die schnellen Antworten!

Cheers

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.