variable aus **argv initialisieren in einem static int
-
Moin ich kann der int Variable "versuch" nicht ihren passenden Wert geben

Zeile 61 error from this location.Ich häng da schon seit drei Tagen dran

Fehler:databaselite.h|15|error: invalid use of member ‘databaselite::versuch’ in static member function|
und
/home/cseipel/Code::Blocks Kram/GTK/test project/animedata/databaselite.h|61|error: from this location|
Habt Gnade ich bin ein totaler Anfänger ;__;
databaselite.h
#ifndef DATABASELITE_H_INCLUDED #define DATABASELITE_H_INCLUDED #include <iostream> #include <vector> #include <sqlite3.h> #include <string> #include <stdlib.h> #include <stdio.h> using namespace std; class databaselite{ private: int versuch; static int ca; int **argc; char ***argv; sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; public: /* KONSTRUKTOR */ databaselite(int *e, char **a){argc = &e; argv = &a;}; /*---------------------------------*/ /* SPIELEREIN */ void get_argc(){ cout << endl << **argc; } // juhu[0][0] wäre auch möglich void get_argv(){ cout << argv[0][0] << endl << "argv";}; /* ---------------------------------- */ static int callback(void *data, int argc, char **argv, char **azColName){ int i; for(i=0; i<argc; i++){ cout << azColName[i] << " = " << argv[i] << endl; } cout << endl; return 0; } static int COUNTcallback(void *data, int argc, char **argv, char **azColName){ for(int i=0; i<argc; i++){ } cout << endl << "-->" << **argv << endl; // EINE ZEILE WEITER UNTEN IST DAS PROBLEM versuch = atoi (*argv); return 0; } void ok(){ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ){ cout << "SQL Fehler: " << zErrMsg; sqlite3_free(zErrMsg); }else{ cout << "Operation wurde erfolgreich ausgeführt\n"; } }// OK ENDE void open(){ rc = sqlite3_open("test.db", &db); if( rc ){ cout << "Datenbank öffnen fehlgeschlagen: " << sqlite3_errmsg(db); }else{ cerr << "Datenbank wurde erfolgreich geöffnet\n"; } // sqlite3_close(db); } // ende von open void close_database(){ sqlite3_close(db); cout << endl << "Datenbank wurde geschlossen"; } void select(){ sql = "SELECT * FROM Serien"; ok(); } void insert(){ sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if( rc != SQLITE_OK ){ cout << "SQL Fehler: " << zErrMsg; sqlite3_free(zErrMsg); }else{ cout << "Records created successfully" << endl; } } // INSERT ENDING void update(){ sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; "; ok(); } // UPDATE ENDE void loeschen(){ sql = "DELETE from COMPANY where ID=2;"; ok(); } // DELETE ENDE void count(){ sql = "SELECT count(*) FROM Serien"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, COUNTcallback, (void*)data, &zErrMsg); /* if( rc != SQLITE_OK ){ cerr << "SQL error: "<< zErrMsg << "\n"; sqlite3_free(zErrMsg); }else{ fprintf(stdout, "Operation done successfully\n"); } */ }// COUNT }; #endif // DATABASELITE_H_INCLUDEDund hier der rest falls ihr ihn braucht.
startmenue.h
#ifndef STARTMENUE_H_INCLUDED #define STARTMENUE_H_INCLUDED #include <iostream> #include <string> #include "databaselite.h" /* Für die Eingabe von nur einen Zeichen [X1] */ #include <stdio.h> #include <string.h> using namespace std; #include "menue.h" class startmenue : public menue{ private: databaselite *dl; public: startmenue(databaselite *A){dl = A;}; ~startmenue(){}; void menue_anzeigen(){ cout << "1. Liste ansehen" << endl << "2. Anime Eintragen" << endl << "3. Lizens "; }; void menue_eingabe(){ cout << endl; string eingabe; eingabe = "XX"; bool dewahrheit = false; while(dewahrheit == false){ cin >> eingabe; if(eingabe.size() == 1){ if(eingabe == "1"|| eingabe == "2"|| eingabe == "3" ){ /* DATENBANK AKTIONEN */ cout << endl << "....................DATENBANK.............................\n" << endl; if(eingabe == "1"){ dl->select(); }else if(eingabe == "2"){ cout << endl << "EINFÜGEN" << endl; dl->count(); // dl->insert(); } dewahrheit = true; }else{ cout << "Du sollst eine Zahl zwischen 1 und 3 eingeben."; eingabe.clear(); } }else{ eingabe.clear(); cout << "Du hast zu viele Zeichen eingegeben"; } } } // ENDE menue_eingabe() }; #endif // STARTMENUE_H_INCLUDEDmain.cpp
#include <iostream> #include <string> #include "../Kommandozeilenparameter/kommandozeilenparameter help.h" #include <sqlite3.h> #include "startmenue.h" #include "listmenue.h" #include "databaselite.h" using namespace std; int main(int argc, char* argv[]) { cout << endl << endl; Kommandozeilenparameter_help help; help.kontrolle(argc,argv); databaselite serie(&argc,argv); serie.open(); startmenue sm(&serie); sm.menue_anzeigen(); sm.menue_eingabe(); serie.close_database(); //serie.get_argv(); //serie.get_argc(); }
-
Der unmittelbare Fehler geht doch direkt aus der Fehlermeldung hervor: Die Memberfunktion
COUNTcallbackist bei dir static (d.h. sie bezieht sich auf keine konkrete Instanz vondatabaselite, sondern ist quasi eine freie Funktion, die mit der Klasse assoziiert wird), aber dennoch greifst du auf den nicht-statischen Memberversuchzu (also einer Variablen, die zu einer bestimmten Instanz vondatabaselitegehört). Wie soll das gehen? Die Funktion kann nicht einerseits ohne konkrete Instanz aufrufbar sein, aber gleichzeitig eine konkrete Instanz benötigen.Insgesamt: Ich glaube, du übernimmst dich gewaltig mit der Aufgabe, üb dich erstmal an etwas Einfacherem. Vor allem vernünftigem C++. Du scheinst leider in den Genuss eines "C++ ist C mit Klassen"-Lehrers gekommen zu sein, der viel von Zeigern erzählt hat. Weder scheinst du diese Zeiger richtig verstanden zu haben, noch würde der Code in dogmatischeren C++ auch nur entfernt so aussehen. Da hättest du so gut wie keine Zeiger, zumindest keine die so direkt sichtbar sind. Und falls doch direkt sichtbar, dann mit ganz klarer Ansage, wie die Besitzverhältnisse sind.
-
SeppJ schrieb:
Weder scheinst du diese Zeiger richtig verstanden zu haben, noch würde der Code in dogmatischeren C++ auch nur entfernt so aussehen. Da hättest du so gut wie keine Zeiger, zumindest keine die so direkt sichtbar sind. Und falls doch direkt sichtbar, dann mit ganz klarer Ansage, wie die Besitzverhältnisse sind.
Das ist schwer, wenn die sqlite-API in "C/C++" d.h. in C gehalten ist und die Schnittstelle so aussieht:
int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open16( const void *filename, /* Database filename (UTF-16) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open_v2( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb, /* OUT: SQLite db handle */ int flags, /* Flags */ const char *zVfs /* Name of VFS module to use */ );Klar, wer sich mit C++ auskennt, kann damit gut umgehen, aber als Anfänger ist es nur zu sehr verlockend, sich diesen Stil anzugewöhnen.
Deshalb rate ich von Datenbankanwendungen erstmal ab, und wenn es unbedingt sein muss, dann empfehle ich SOCI.
-
Es gibt aber auch C++-Wrapper für SQLite, z.B.
CppSQLite - C++ Wrapper for SQLite
Kompex SQLite Wrapper for C++
-
Th69 schrieb:
Es gibt aber auch C++-Wrapper für SQLite, z.B.
CppSQLite - C++ Wrapper for SQLite
Kompex SQLite Wrapper for C++Äh ja, sie existieren.
Die erste empfiehlt solchen Code:
char buf[128]; sprintf(buf, "insert into emp (empname) values ('Empname%06d');", i+1); db.execDML(buf); cout << " primary key: " << db.lastRowId() << endl;Bei der zweiten sieht das so aus:
Kompex::SQLiteDatabase *pDatabase = new Kompex::SQLiteDatabase("test.db", SQLITE_OPEN_READWRITE, 0);
-
SeppJ schrieb:
Der unmittelbare Fehler geht doch direkt aus der Fehlermeldung hervor: Die Memberfunktion
COUNTcallbackist bei dir static (d.h. sie bezieht sich auf keine konkrete Instanz vondatabaselite, sondern ist quasi eine freie Funktion, die mit der Klasse assoziiert wird), aber dennoch greifst du auf den nicht-statischen Memberversuchzu (also einer Variablen, die zu einer bestimmten Instanz vondatabaselitegehört). Wie soll das gehen? Die Funktion kann nicht einerseits ohne konkrete Instanz aufrufbar sein, aber gleichzeitig eine konkrete Instanz benötigen.Insgesamt: Ich glaube, du übernimmst dich gewaltig mit der Aufgabe, üb dich erstmal an etwas Einfacherem. Vor allem vernünftigem C++. Du scheinst leider in den Genuss eines "C++ ist C mit Klassen"-Lehrers gekommen zu sein, der viel von Zeigern erzählt hat. Weder scheinst du diese Zeiger richtig verstanden zu haben, noch würde der Code in dogmatischeren C++ auch nur entfernt so aussehen. Da hättest du so gut wie keine Zeiger, zumindest keine die so direkt sichtbar sind. Und falls doch direkt sichtbar, dann mit ganz klarer Ansage, wie die Besitzverhältnisse sind.
Also kann ich über eine Static Funktion unmöglich werte außerhalb von Static ansprechen selbst wenn ich extra Pointer verwende :(?
Das heißt ich muss diese Funktion zum laufen bringen ohne das da Static steht
Da bin ich echt überfragt wie ich das jetzt hinzauber.
Und ja ich übernehme mich wirklich das ist meine Art zu lernen
-
Tim schrieb:
Also kann ich über eine Static Funktion unmöglich werte außerhalb von Static ansprechen selbst wenn ich extra Pointer verwende :(?
Erklär mal, was du denkst, was static bedeutet. Da das Wort je nach Kontext was anderes bedeutet, gehört zu einer Erklärung natürlich auch dazu, was es in welchem Zusammenhang bedeutet.Und ja ich übernehme mich wirklich das ist meine Art zu lernen

Dann lass das doch. Du scheinst sehr verwirrt zu sein und weniger als die Hälfte der Sachen zu verstehen, die du da überhaupt tust. Deswegen funktioniert es auch nicht.
Ich nehme mal an, hier soll ein konkretes Problem gelöst werden. Wenn du den SQL-Kram erst einmal komplett ignorierst und anhand des üblichen Lernprogramms erst einmal die Grundlagen lernst, dann lösen sich deine Probleme nach ein paar Wochen von ganz alleine. Wenn du ohne Ahnung was du tust dein Programm weiter schreibst, dann kommt nur Murks dabei raus und du lernst dabei noch nicht einmal, wie es richtig geht.
-
SeppJ schrieb:
Erklär mal, was du denkst, was static bedeutet.
Static ist das, was man hinschreibt, wenn man ein Callback haben möchte und der Compiler meckert

@Tim:
Du musst das Objekt, auf dem du arbeiten möchtest, über den data-Parameter der Callback-Funktion hineinreichen. Du hast dir anscheinend irgendwas zusammengereimt, wozu das data gut ist, das war Unsinn. Es dürfte ungefähr so gehen (vom Prinzip her, ich hab jetzt nicht gecheckt, welche Callback-Schnittstelle SQLite tatsächlich erwartet...)void count(){ sql = "SELECT count(*) FROM Serien"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, COUNTcallback, this, &zErrMsg); }// COUNT static int COUNTcallback(void *data, int argc, char **argv, char **azColName){ databaselite* instance = static_cast<databaselite*>(data); for(int i=0; i<argc; i++){ } cout << endl << "-->" << **argv << endl; // EINE ZEILE WEITER UNTEN IST DAS PROBLEM instance->versuch = atoi (*argv); return 0; }Falls du nicht weißt, was der this-Zeiger ist, schau dir das zuerst an, sonst verstehst du nicht, was ich da gemacht habe.
-
Bashar schrieb:
SeppJ schrieb:
Erklär mal, was du denkst, was static bedeutet.
Static ist das, was man hinschreibt, wenn man ein Callback haben möchte und der Compiler meckert

@Tim:
Du musst das Objekt, auf dem du arbeiten möchtest, über den data-Parameter der Callback-Funktion hineinreichen. Du hast dir anscheinend irgendwas zusammengereimt, wozu das data gut ist, das war Unsinn. Es dürfte ungefähr so gehen (vom Prinzip her, ich hab jetzt nicht gecheckt, welche Callback-Schnittstelle SQLite tatsächlich erwartet...)void count(){ sql = "SELECT count(*) FROM Serien"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, COUNTcallback, this, &zErrMsg); }// COUNT static int COUNTcallback(void *data, int argc, char **argv, char **azColName){ databaselite* instance = static_cast<databaselite*>(data); for(int i=0; i<argc; i++){ } cout << endl << "-->" << **argv << endl; // EINE ZEILE WEITER UNTEN IST DAS PROBLEM instance->versuch = atoi (*argv); return 0; }Falls du nicht weißt, was der this-Zeiger ist, schau dir das zuerst an, sonst verstehst du nicht, was ich da gemacht habe.
Sry das ich mich so spät melde ich war schulisch leider stark abgelenkt.
Das mit dem This Zeiger ist ne super Idee aber leider komme ich nun zu einem alten Problem wieder zurück.
Ich bekomm, wenn ich deinen Code ausführe am ende immer ein Segmentation fault raus.
http://de.wikipedia.org/wiki/SchutzverletzungWas das ist glaube ich zu wissen aber naja ich arbeite mal weiter und werd am besten Morgen nochmal alles schön ordentlich machen.
Auch wenn ich mir das wirklich schwer bei sqlite3 vorstelle.NIEMALS AUFGEBEN

-
Wäre nicht die einfachste Lösung anstatt schwachsinnig von int main(argc,argv) zu nutzen ein eigenes in der Klasse zu erstellen
?
-
Tim schrieb:
Wäre nicht die einfachste Lösung anstatt schwachsinnig von int main(argc,argv) zu nutzen ein eigenes in der Klasse zu erstellen
?Falls du noch ein paar Objekte in deinen Satz einfügst, kann man vielleicht sogar verstehen, was du wissen möchtest.
-
Entschuldige ich wurde von Freunden zum Döner futtern abgeholt und hab nicht nachgelesen was ich da vorhin getippt habe.
Aber ich hab immerhin eine freudige Nachricht.Ich hab mein Problem selbstständig gelößt.
#ifndef DATABASE_H_INCLUDED #define DATABASE_H_INCLUDED #include <sqlite3.h> #include <iostream> using namespace std; class database{ private: int argc; char* argv[]; sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; public: // database(sqlite3 *wusch){db = wusch;}; static int callback(void *data, int argc, char **argv, char **azColName){ int i; // cout << "CALLBACK FUNKTION AUFGERUFEN\n"; for(i=0; i<argc; i++){ cout << azColName[i] << " = " << argv[i] << "\n"; } cout << "\n"; return 0; } void open_database(){ rc = sqlite3_open("test.db", &db); if( rc ){ cout << "Datenbank kann nicht geöffnet werden: " << sqlite3_errmsg(db); }else{ cout << "Datenbank wurde erfolgreich geöffnet\n"; } } void select(){ sql = "SELECT * from Serien"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ){ cout << "SQL error: " << zErrMsg << "\n"; sqlite3_free(zErrMsg); }else{ cout << "Operation wurde erfolgreich ausgeführt\n"; } } void count(){ sql = "SELECT count(*) FROM Serien"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ){ cout << "SQL error: " << zErrMsg << "\n"; sqlite3_free(zErrMsg); }else{ cout << "Operation wurde erfolgreich ausgeführt\n"; } } }; #endif // DATABASE_H_INCLUDEDDas ist zu 100% nicht perfekt aber es funktioniert

-
Naja "gelöst" ist da wohl relativ. Du hast einfach den schwierigen Teil weggelöscht.
-
Bashar schrieb:
Naja "gelöst" ist da wohl relativ. Du hast einfach den schwierigen Teil weggelöscht.
Das ist wahr aber mir war einfach nicht klar wie unnützt schwer ich es mir vor ner Woche gemacht habe.
-
Stimmt, könnte ja sein, dass man aus Versehen was lernt.

-
An Zeile 29 merk ich. Ich hab immer noch das selbe Problem

Peinlich peinlich von mir.Ich lese jetzt zur Sicherheit nochmal nach wofür Static steht auch, wenn ich nicht glaube das mir das weiter hilft.
#ifndef DATABASE_H_INCLUDED #define DATABASE_H_INCLUDED #include <sqlite3.h> #include <iostream> using namespace std; class database{ private: int argc; char* argv[]; sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; int dusche; public: // database(sqlite3 *wusch){db = wusch;}; static int callback(void *data, int argc, char **argv, char **azColName){ int i; // cout << "CALLBACK FUNKTION AUFGERUFEN\n"; for(i=0; i<argc; i++){ cout << azColName[i] << " = " << argv[i] << "\n"; } dusche = 33; cout << "\n"; return 0; } void open_database(){ rc = sqlite3_open("test.db", &db); if( rc ){ cout << "Datenbank kann nicht geöffnet werden: " << sqlite3_errmsg(db); }else{ cout << "Datenbank wurde erfolgreich geöffnet\n"; } } void select(){ sql = "SELECT * from Serien"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ){ cout << "SQL error: " << zErrMsg << "\n"; sqlite3_free(zErrMsg); }else{ cout << "Operation wurde erfolgreich ausgeführt\n"; } } void count(){ sql = "SELECT count(*) FROM Serien"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ){ cout << "SQL error: " << zErrMsg << "\n"; sqlite3_free(zErrMsg); }else{ cout << "Operation wurde erfolgreich ausgeführt\n"; } } }; #endif // DATABASE_H_INCLUDED
-
Hab leider nichts neues für mich aus meinem Buch+Google über Static erfahren.
Ich weiß nur eines.
Ich hab kein Plan wieso ich in der Ccallback Funktion keine Variable aus private oder public ansprechen kann. Was für ein Weg gibt es das Ergebnis von Ccallback in eine Variable zu speichern?Zeile 42 <---
#ifndef DATABASE_H_INCLUDED #define DATABASE_H_INCLUDED #include <sqlite3.h> #include <iostream> #include <stdlib.h> using namespace std; class database{ private: int argc; char* argv[]; sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; int domian; public: // database(sqlite3 *wusch){db = wusch;}; static int callback(void *data, int argc, char **argv, char **azColName){ int i; // cout << "CALLBACK FUNKTION AUFGERUFEN\n"; for(i=0; i<argc; i++){ cout << azColName[i] << " = " << argv[i] << "\n"; } cout << "\n"; return 0; } static int Ccallback(void *data, int argc, char **argv, char **azColName){ int i; // cout << "CALLBACK FUNKTION AUFGERUFEN\n"; for(i=0; i<argc; i++){ cout << azColName[i] << " = " << argv[i] << "\n"; } cout << "\n"; domian = atoi(argv[0]); return 0; } void open_database(){ rc = sqlite3_open("test.db", &db); if( rc ){ cout << "Datenbank kann nicht geöffnet werden: " << sqlite3_errmsg(db); }else{ cout << "Datenbank wurde erfolgreich geöffnet\n"; } } void select(){ sql = "SELECT * from Serien"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ){ cout << "SQL error: " << zErrMsg << "\n"; sqlite3_free(zErrMsg); }else{ cout << "Operation wurde erfolgreich ausgeführt\n"; } } void count(){ sql = "SELECT count(*) FROM Serien"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, Ccallback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ){ cout << "SQL error: " << zErrMsg << "\n"; sqlite3_free(zErrMsg); }else{ cout << "Operation wurde erfolgreich ausgeführt\n"; } } void get_domian(){ cout << "\nDOMIAN: " << domian; } }; #endif // DATABASE_H_INCLUDED
-
Tim schrieb:
Hab leider nichts neues für mich aus meinem Buch+Google über Static erfahren.
Was hast du denn erfahren? static hat in C++ so ca. 5 verschiedene Bedeutungen, von denen dich gerade die für Membervariablen und Memberfunktionen interessiert. Das wesentliche über static weißt du, wenn du diese Frage beantworten kannst:
[...] wieso ich in der Ccallback Funktion keine Variable aus private oder public ansprechen kann.
-
Bashar schrieb:
Tim schrieb:
Hab leider nichts neues für mich aus meinem Buch+Google über Static erfahren.
Was hast du denn erfahren? static hat in C++ so ca. 5 verschiedene Bedeutungen, von denen dich gerade die für Membervariablen und Memberfunktionen interessiert. Das wesentliche über static weißt du, wenn du diese Frage beantworten kannst:
[...] wieso ich in der Ccallback Funktion keine Variable aus private oder public ansprechen kann.
Naja wenn ich Static vor ner Variable oder Funktion schreibe kann ich die nur in der selben Datei ansprechen.
Und bei Static Varibalen bzw. Funktionen wo man ein Static vorne dran schreibt bleibt die Variabel/Rückgabewert erhalten.
#include <iostream> using namespace std; int counter(void); int main() { counter(); counter(); counter(); int dumm; dumm = counter(); cout << "dumm ist: " << dumm; return 0; } int counter(void){ static int ival; cout << "ival : " << ival << endl; ++ival; return ival; }
-
Ja, diese Bedeutungen von static gibt es auch. Wie gesagt, 5.