C/C++ fähige Menschen gesucht

Hilikus

Enthusiast
Thread Starter
Mitglied seit
05.04.2005
Beiträge
3.413
Hallo zusammen,

ich suche jemand, der sich etwas mit C/C++ auskennt und mir bei diesem klick helfen kann.

Für euch mag das easy sein, für mich ist es chinesisch^^

Würde mich auch via Paypal erkenntlich zeigen.
Schreibt doch hier oder per PM

Grüße
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Ich hoffe du haust mich nicht wenn ich dir sage, dass die Kolegen bereits alles gesagt haben. Du hast in deinem Quellcode mehrere Aufrufe der einen besagten Funktion. Einen Funktionsaufruf hast du bereits berichtigt aber die anderen nicht. Habs mal für dich farbig gemacht.

Code:
char dayWhenFileWasLastWritten[80];

	while ((timediff < m_time) || m_time == 0)

	{

		if [color=red](strftime("%d")[/color] != dayWhenFileWasLastWritten) {
		//if [color=red](strftime("%d")[/color] != dayWhenFileWasLastWritten.c_str()) {
			errorcode = CAENVME_SetOutputRegister(Handle, Mask); // Sets the NIM Level of channel0 output to a logical 1 in order to prevent from any events being written to the QDC and the GPS Card.

			if (rawfile != null && rawfile.is_open()) {
				rawfile.close();
			}
			ofstream rawfile("rawfile" + [color=red]strftime("%Y-%m-%d") + ".dat");[/color]
			//dayWhenFileWasLastWritten = strftime("%d");
			
			//strftime (dayWhenFileWasLastWritten,80,"%d",localtime ( &rawtime ));
			strftime(dayWhenFileWasLastWritten,80,"%d",localtime (&rawtime));
			
			errorcode1 = CAENVME_ReadCycle(Handle, clearreg, &data, cvA24_U_DATA, cvD16);
			mbg_clr_ucap_buff(dh);
			errorcode = CAENVME_ClearOutputRegister(Handle, Mask); // Sets the NIM Level of channel0 output to a logical 0 in order to let events come through to the GPS Card and the QDC
		}
 
Zuletzt bearbeitet:
Und wie siehts aus. Hat es funktioniert und wenn ja was ist mit der versprochenen Belohnung :d
 
Hey sorry für das lange warten, am WE kam ich nicht dazu.

Ja, der Fehler ist weg und ein anderer da :)

Das Stück Code sieht jetzt so aus:

Code:
//string dayWhenFileWasLastWritten = "";
	char dayWhenFileWasLastWritten[80];

	while ((timediff < m_time) || m_time == 0)

	{
		time_t rawtime;
		if (strftime(dayWhenFileWasLastWritten,80,"%d",localtime (&rawtime)) != dayWhenFileWasLastWritten) {
		//if (strftime("%d") != dayWhenFileWasLastWritten.c_str()) {
			errorcode = CAENVME_SetOutputRegister(Handle, Mask); // Sets the NIM Level of channel0 output to a logical 1 in order to prevent from any events being written to the QDC and the GPS Card.

			if (rawfile != null && rawfile.is_open()) {
				rawfile.close();
			}
			ofstream rawfile("rawfile" + strftime(dayWhenFileWasLastWritten,80,"%Y-%m-%d",localtime (&rawtime)) + ".dat");
			//dayWhenFileWasLastWritten = strftime("%d");
			
			//strftime (dayWhenFileWasLastWritten,80,"%d",localtime ( &rawtime ));
			strftime(dayWhenFileWasLastWritten,80,"%d",localtime (&rawtime));
			
			errorcode1 = CAENVME_ReadCycle(Handle, clearreg, &data, cvA24_U_DATA, cvD16);
			mbg_clr_ucap_buff(dh);
			errorcode = CAENVME_ClearOutputRegister(Handle, Mask); // Sets the NIM Level of channel0 output to a logical 0 in order to let events come through to the GPS Card and the QDC
		}
wobei Zeile 214 der Zeile if (strftime(dayWhenFileWasLastWritten,80,"%d",localtime (&rawtime)) != dayWhenFileWasLastWritten) { entspricht.

und produziert beim compilieren folgende Fehler:

Code:
v265_j.cc:214: error: ISO C++ forbids comparison between pointer and integer
v265_j.cc:218: error: `null' undeclared (first use this function)
v265_j.cc:218: error: (Each undeclared identifier is reported only once for 
   each function it appears in.)
v265_j.cc:218: error: request for member `is_open' in `rawfile', which is of 
   non-aggregate type `std::ofstream ()()'
v265_j.cc:219: error: request for member `close' in `rawfile', which is of 
   non-aggregate type `std::ofstream ()()'
v265_j.cc:221: error: invalid operands of types `const char*' and `const 
   char[5]' to binary `operator+'
 
Zuletzt bearbeitet:
Das ist einfach. Ich übersetz den Fehler mal für dich.

Code:
char dayWhenFileWasLastWritten[80];
...
		if (strftime(dayWhenFileWasLastWritten,80,"%d",localtime (&rawtime)) != dayWhenFileWasLastWritten) {
Code:
v265_j.cc:214: error: ISO C++ forbids comparison between pointer and integer

Deine Funktion wird vermutlich einen Integer zurückgeben aber du vergleichst das ganze mit einem Pointer auf das 1. Element eines Char Arrays.

Was soll der Vergleich eigentlich bewirken?
 
Da soll eine durchgehende Messung stattfinden. Einmal am Tag (beim Tageswechsel) soll die Datei rawfileaktuellesdatum weggeschrieben werden und eine neue Datei angefangen werden.
Der Vergleich soll feststellen, ob das passiert ist und wenn ja, weiter gehen zur nächsten Messung. Wenn nein, dann eben wegschreiben und neues File beginnen.
 
Rechts vom = gehört das heutige Tagesdatum hin und nicht der Pointer. Dann passt der Vergleich auch.
 
Rechts vom = gehört das heutige Tagesdatum hin und nicht der Pointer. Dann passt der Vergleich auch.

wie meinen? :)
Also wie sähe das in Code aus?

Also falls jemand mir helfen mag, kann ich auch per PM mein Skype oder ICQ Kontakt oder Tel Nummer geben. Ich denke das ist dann eine Sache von 30 Minuten etwa und das wäre mir auf jeden Fall 20€/Stunde Wert (per Paypal dann eben, sollte kein Problem sein).

Grüße
 
Zuletzt bearbeitet:
Ja sry bin hier auf Arbeit und da macht sich das mit ICQ und Co etwas schwierig :d

Meine Aussage von Gestern muss ich zurückziehen. Der komplette Vergleich ist schwachsinn. Die Funktion strftime kopiert deine rawtime in ein Array. Am Ende wird immer eine 0 zurückgeliefert. Macht irgendwie wenig Sinn die 0 mit irgendwas zu vergleichen.

Haut irgendwie vorne und hinten nicht hin. Auch alle anderen Aufrufe von strftime sind schwachsinn. Teste mal bitte was dir strftime zurückgibt. Nicht das ich hier gerade eine andere strftime Funktion habe als du.

Was steht eigentlich in rawtime drin? Mangels restlichem Quellcode kann ich da nur raten aber ich wette da steht nicht das Datum der letzten Datei drin. Alles was ich dir jetzt schreiben könnte, würde also nicht den gewünschten Effekt erziehlen weil schon die Voraussetzungen fehlen.

Ich könnte dir frühstens am WE mit ICQ oder ähnlichem helfen. Bis dahin müssen wir weiter über das Forum arbeiten.
 
Hi zusammen,

ich bin ein ganzes Stück weiter gekommen,

hier mal der aktuelle Code:

Code:
        time_t rawtime;
	time (&rawtime);
	char dayWhenFileWasLastWritten[80] = "0";
	char currentday[80] = "0";
	char currentdate[80];
	strftime(dayWhenFileWasLastWritten,80,"%d",localtime (&rawtime));

    ofstream rawfile(currentdate);	
















    while ((timediff < m_time) || m_time == 0)

    {






		cout << "test2...\n";
		
		strftime(currentday,80,"%d",localtime (&rawtime));
		strftime(currentdate,80,"%Y-%m-%d",localtime (&rawtime));
		
		cout << "test3...\n";


		if ( currentday != dayWhenFileWasLastWritten) {
			cout << "test4...\n";
		
		

		//if (strftime("%d") != dayWhenFileWasLastWritten.c_str()) {
			errorcode = CAENVME_SetOutputRegister(Handle, Mask); // Sets the NIM Level of channel0 output to a logical 1 in order to prevent from any events being written to the QDC and the GPS Card.

			if (rawfile != NULL && rawfile.is_open()) {
				rawfile.close();
			}
			
			
			//string completename = prefix+suffix;
			
			//ofstream rawfile("rawfile" + currentday + ".dat");
			ofstream rawfile(currentdate".dat");
			//dayWhenFileWasLastWritten = strftime("%d");
			
			//strftime (dayWhenFileWasLastWritten,80,"%d",localtime ( &rawtime ));
			strftime(dayWhenFileWasLastWritten,80,"%d",localtime (&rawtime));
			
			errorcode1 = CAENVME_ReadCycle(Handle, clearreg, &data, cvA24_U_DATA, cvD16);
			mbg_clr_ucap_buff(dh);
			errorcode = CAENVME_ClearOutputRegister(Handle, Mask); // Sets the NIM Level of channel0 output to a logical 0 in order to let events come through to the GPS Card and the QDC
			errorcode1 = CAENVME_ReadCycle(Handle, statusreg, &data,cvA24_U_DATA, cvD16); 
	    
			READY = (data & 0x8000)/32678;
			while (READY ==0)
			   { 
				//read status
				errorcode1 = CAENVME_ReadCycle(Handle, statusreg,&data,cvA24_U_DATA, cvD16); 
			READY = (data & 0x8000)/32678;
  			}
		}

Ich habe damit noch ein Problem:

Der Vergleich if ( currentday != dayWhenFileWasLastWritten) geht aus irgendeinem Grund scheinbar bei jedem Durchgang auf, obwohl ich ja am Anfang extra mal testweise sie gleich gesetzt habe.
Kann mir jemand sagen, wo der Fehler liegt?

Viele Grüße
 
Mit if ( currentday != dayWhenFileWasLastWritten) vergleichst du die Anfangsadressen der beiden Arrays, NICHT den Inhalt der Arrays. Und da es zwei verschiedene Arrays sind, sind diese natürlich immer ungleich.

Warum verwendest du nicht einfach den Rückgabewert von localtime() direkt (über tm_mday kommst du an den Tag), anstatt dir mir strings das Leben schwer zu machen?

Mach dir doch einfach mal die Mühe, genau zu beschreiben, was du eigentlich machen willst (Mit einer Endlosschleife den Prozessor auszulasten, um dann einmal am Tag eine leere Datei zu erstellen scheint mir wenig sinnvoll). Das dürfte deutlich einfacher und schneller gehen, als selbst am Code zu basteln. Und mit einer solchen Beschreibung dürfte die Implementierung für jemand mit ein bisschen Erfahrung eine Sache von Minuten sein.
 
Hallo,

dann erklär ich nochmal genau:

Es handelt sich um ein Messprogramm, das Daten eines externen Crates ausliest.
Ich habe ca. 100 Events pro Sekunde und jedes Event ergibt 15 Messwerte an meinem Crate.
Diese Messwerte werden dann zusammen mit einer Zeitinfo in eine Datei im Asci Format gechrieben.
Bisher konnte man bei dem Programm eine Messzeit eingeben in Sekunden und so lange hat er gemessen und alles in einer Datei mit dem Namen rawfile.dat geschrieben.
DAS funktioniert auch alles.

Jetzt soll es also eine Erweiterung geben und diese Erweiterung ist das Stück Code hier aus dem Thread.
Es soll jetzt nämlich kontinuierlich gemessen werden können.
Also soll es für jeden Tag ein eigenes Messfile geben mit dem Namen rawfile_aktuelles Dateum.dat (nur das Datum ohne die Buchstaben davor wäre auch i.O. das ist nicht so tragisch).

Dafür ist eben die Idee, dass man es in die "Mess" - While Schleife an den Anfang schreibt. Jedesmal bevor er die Daten ausliest, soll er checken, ob currentday noch der gleiche Tag des Monats ist wie daywhenfilewaslastwritten. Wenn ja (also beim Wechsel um Mitternacht), dann die if Schleife verlassen und Daten auslesen. Wenn nein, dann soll er die Datei dichtmachen (eben schön mit dem Datum etc.) und eine neue rawfile öffnen mit currentdate.
Jetzt sollte der Vergleich zwischen currentdate und daywhenfilewaslastwritten bis zur nächsten Mitternacht nicht aufgehen, sprich jedesmal die if Schleife verlassen usw.
Ist es jetzt einigermaßen klar?
Wenn die FUNKTION, die ich brauche auch ganz anders zu haben ist, wäre es natürlich auch ok. Das spielt keine Rolle, es muss nu das gewollte tun :)


Vielen Dank für den Hinweise mit dem Vergleich.
Grüße
 
Das sieht schonmal erheblich besser aus.

ofstream rawfile(currentdate".dat");

Da müsste der Compiler noch meckern. Da Fehler der Operator zwischen dem Array und dem String.
Außerdem bin ich mir nicht ganz sicher ob der überhaupt ein Array so auswerten kann. Soweit ich mich erinnern kann, ist das vom Compiler abhängig.

Bei rawtime steht immer noch nicht das richtige Datum drin. Der Vergleich wird also genau 24 Stunden funktionieren und püunktlich um Mitternacht wird er ständig versuchen eine neue Datei zu schreiben. Ich schlage vor du ziehst das Datum nach sobald einmal eine neue Datei geschrieben wurde. Also im IF rawtime neu zuweisen.
 
Zuletzt bearbeitet:
Meinst du diese Zeilen

time_t rawtime;
time (&rawtime);

noch in die if Schleife kopieren?


Dann muss ich es noch gebacken bekommen, dass er auch den Inhalt der Arrays vergleicht und nicht die Anfnagsadresse, wie mich raechaer darauf hingewiesen hat.
 
Hier mal mein Vorschlag, vielleicht hilft dir das weiter. Ist nicht getestet, sollte aber zumindest von der Idee her funktionieren.
PHP:
{
	unsigned int last_day = -1;
	ofstream rawfile;
	
	while (true)	// Hier muss deine bereits vorhandene while Schleife hin
	{
		time_t raw_time;
		time(&raw_time);
		tm* loc_time = localtime(&raw_time);

		// Neue Datei öffnen wenn sich Tag ändert
		if (loc_time->tm_mday != last_day)
		{
			last_day = loc_time->tm_mday;

			// Alte Datei schließen
			if(rawfile.is_open())
				rawfile.close();

			char file_name[80];
			strftime (file_name,80,"C:\\pfad\\rawfile_%Y_%m_%d.dat",loc_time);

			// Neue Datei öffnen
			rawfile.open(file_name);
		}
		// Messwert auslesen

		// Messwert in Datei schreiben
		rawfile << "Ich bin der Messwert" << endl;
	}
}
 
w00000000000000000t!!!

Danke danke danke, es scheint zu funzen. Jetzt werd ich das ganze mal über Nacht testen.

Hast ne PM :)

Edit:

Noch ein Nachtrag:

Die letzte zu implementierende Funktion ist ein Userabbruch durch Tastendruck (an der Tastatur logischerweise) bzw. über das Terminal (über SSH, das Programm wird auch nur übers Terminal gestartet) per SSH verbundenm abgesehen von Strg + C (dabei werden nämlich die bisherigen Daten des heutigen Tages verworfen, was nicht sehr sinnvoll ist).

Ein Freund hat mir empfohlen, das hier vor die While Schleife:

Code:
// Für User-Abbruch
	char c;
	  int cancel, tem;
	  int cnt = 0;

das hier dann oft in die While Schleife

Code:
if (cancel != 1) {
			cancel = read(0, &c, 1);
		}

und dann am Ende der While Schleife das hier zu schreiben

Code:
iif (cancel > 0) {
			 cout << "Abbruch durch User" << endl;
			 goto endofmeasurement;
		 }


Ein Abbruch ist damit aber über SSH im Terminal schonmal nicht geglückt, bzw. er geht immer in die if Schleife rein und kommt nicht mehr raus, wie es aussieht.

Habt ihr ne elegantere Idee?


Edit 2:
Habs hinbekommen mit diesem Beispiel:

Code:
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>

int
main()
{
char c;
int n, tem;
int cnt = 0;

tem = fcntl(0, F_GETFL, 0);
fcntl (0, F_SETFL, (tem | O_NDELAY));
while (1) {
n = read(0, &c, 1);
if (n > 0) break;
cnt = cnt + 1;
}
fcntl(0, F_SETFL, tem);
printf("cnt=%d\n", cnt);
}
und es funzt :)

So, Feierabend für heute.
 
Zuletzt bearbeitet:
Am einfachsten machst du das mit Ctrl-C und einem eigenen Signalhandler, also in etwa so:
PHP:
#include <signal.h>

bool request_exit = false;

void handler(int sig)
{
	request_exit = true;
}


int main()
{
	unsigned int last_day = -1;
	ofstream rawfile;
	
	// Für Ctrl-C signal registrieren
	signal(SIGINT, handler);

	while (true)	// Hier muss deine bereits vorhandene while Schleife hin
	{
		if(request_exit)
		{
			cout << "Abbruch durch User" << endl;
			break;
		}

		time_t raw_time;
		time(&raw_time);
		tm* loc_time = localtime(&raw_time);

		// Neue Datei öffnen wenn sich Tag ändert
		if (loc_time->tm_mday != last_day)
		{
			last_day = loc_time->tm_mday;

			// Alte Datei schließen
			if(rawfile.is_open())
				rawfile.close();

			char file_name[80];
			strftime (file_name,80,"C:\\temp\\rawfile_%Y_%m_%d.dat",loc_time);

			// Neue Datei öffnen
			rawfile.open(file_name);
		}

		// Messwert auslesen

		// Messwert in datei schreiben
		rawfile << "Ich bin der Messwert" << endl;
	}

}
 
danke dir vielmals.

Das mit dem Abbruch funzt schonmal, ebenso das Anlegen eines schön benamsten rawfiles, wenn jetzt noch heute Nacht noch planmäßig ein neues File erzeugt wird, macht das Programm was es soll.
Dann muss das nur noch auch für die Messelektronik gelten :fresse2:

Schönes WE euch noch
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh