Zum Forum springen
Benachrichtigungen
Alles löschen

c++ Code in c umschreiben

10 Beiträge
5 Benutzer
0 Reactions
1,002 Ansichten
StefanNRW
Beigetreten: 15.08.2007

Hi

ich hab leider nochmal ein Programmierproblem und kenne mich mit c ehrlich gesagt gar nicht aus (um genau zu sein mit programmieren allgemein, darum verzeiht mir, wenn ich blöde Sachen schreibe :) )

Ich habe ein funktionierendes c++ Programm. Einen kleinen Teil davon würde ich jetzt gerne in ein Programm einfügen, das in c geschrieben ist. Ich glaube ich bin gar nicht so weit davon entfernt, dass das klappt - der letzte Fehler, den der Compiler anzeigt ist dieser hier:

error: request for member 'at' in something not a structure or union

er bezieht sich auf diese Zeile Code:

B_pre=profil->at((int)index)*B00;

und diese Zeile Code befindet sich in folgender Vor-Schleife:

Spoiler

for ( i = 1; i <= trajSteps; i ++)
{
double index=floor((last-2*floor/2+0.5)+1));

double B_pre =B00*sin(last*PI);
B_pre=profil->at((int)index)*B00;

}

Profil war im c++ Programm als

std::vector<double> profil (1001,0);

definiert - das mochte der Compiler in c nicht, also hab ich es als

float profil [1001];

definiert - liegt hier der Fehler oder im "at"? Oder in beidem?


Antwort
Zitat
9 Antworten
sarc
Beigetreten: 06.06.2008

vector ist halt ne Klasse, die die Methode at mit anbietet. C denkt jetzt, das ist ein Feld in ner Union, weil es keinen Klassenmechanismus hat.

profil[(int) index] sollte aber funktionieren.


Antwort
Zitat
StefanNRW Themenstarter
StefanNRW
Beigetreten: 15.08.2007

Klasse, danke! Das hat geklappt :)

Jetzt sehe ich zwar wieder ein paar andere Fehler, aber denen kann ich dann erstmal wieder mit meinem rudimentären Wissen auf den Grund gehen...

War es denn prinzipiell richtig

std::vector<double> profil (1001,0);

aus dem c++ Programm mit

float profil [1001];

zu übersetzen?


Antwort
Zitat
Rho0
Beigetreten: 20.10.2008

Original von StefanNRW
Klasse, danke! Das hat geklappt :)

Jetzt sehe ich zwar wieder ein paar andere Fehler, aber denen kann ich dann erstmal wieder mit meinem rudimentären Wissen auf den Grund gehen...

War es denn prinzipiell richtig

std::vector<double> profil (1001,0);

aus dem c++ Programm mit

float profil [1001];

zu übersetzen?

wie immer: jein.

die klasse std::vector bietet dir halt funktionalitäten an, die du bei einem array eben nicht hast. wenn du diese funktionalitäten nutzen willst, dann musst du jetzt eben diese funktionalitäten in c schreiben.

aber mal andersrum: jeder c++ compiler kann doch c-code interpretieren, also warum kompilierst du das alte programm in c nicht in c++ und sparst dir damit dieses umschreiben?


Antwort
Zitat
StefanNRW Themenstarter
StefanNRW
Beigetreten: 15.08.2007

Das geht aber nur, wenn ich c und c++ in verschiedenen Source-Dateien habe oder? Der c++ Code, den ich haben möchte, soll nur als ganz kleine, nicht eigenständige Ergänzung in eine der Source-Dateien...


Antwort
Zitat
Rho0
Beigetreten: 20.10.2008

hilft das weiter?

ich hab ehrlich gesagt noch nie ein altes c-file in c++ kompiliert, aber so wie ich die diskussion bei stackoverflow verstehe, sind die probleme, die entstehen, halt so namensverletzungen (wenn ne c-variable "friend" heißt, weil "friend" in c++ schon reserviert ist), oder so cast-probleme.


Antwort
Zitat
StefanNRW Themenstarter
StefanNRW
Beigetreten: 15.08.2007

Danke, sieht auch interessant aus - spiel ich mal morgen ein wenig mit rum :) (wobei ich mit der "Übersetzung" auch schon relativ weit bin, mal schauen was am Ende schneller geht)


Antwort
Zitat
Kampfschildkroete
Beigetreten: 05.06.2006

Original von StefanNRW
Danke, sieht auch interessant aus - spiel ich mal morgen ein wenig mit rum :) (wobei ich mit der "Übersetzung" auch schon relativ weit bin, mal schauen was am Ende schneller geht)

Machst du das Umschreiben aus Performancegründen oder einfach als Übung?

Weil aus Performancegründen kann es dir passieren, dass das Programm genauso schnell/langsam ist wie vorher, da ein C-Array oder ein C++-vector zum Beispiel beim Zugriff über eine Schleife (fast) identischen Assemblercode produzieren. Der vector hat ein, zwei Befehle mehr bevor die Schleife losläuft. In der Schleife selbst haben dann beide die gleichen Assemblerbefehle (sind also gleich schnell).


Antwort
Zitat
StefanNRW Themenstarter
StefanNRW
Beigetreten: 15.08.2007

Original von Kampfschildkroete

Original von StefanNRW
Danke, sieht auch interessant aus - spiel ich mal morgen ein wenig mit rum :) (wobei ich mit der "Übersetzung" auch schon relativ weit bin, mal schauen was am Ende schneller geht)

Machst du das Umschreiben aus Performancegründen oder einfach als Übung?

Weder noch :)

Ich hab ein recht komplexes funktionierendes c-Programm, das eine bestimmte physikalische Struktur simulieren kann. Und ich habe ein funktionierendes c++ Programm, das eine andere physikalische Struktur simulieren kann + eine Eigenschaft, die ich jetzt im c-Programm brauche.

Im Prinzip kopier ich mir also alles, was zu dieser Eigenschaft gehört, in das c-Programm und pass alles an, von Variablennamen bis Simulationsgrenzen.


Antwort
Zitat
MisterJ
Beigetreten: 26.03.2006

Ich würd ja einfach den C++ code als c++ kompilieren und fertig.
Was soll die extra source datei denn ausmachen ausser rumliegen? Wenn der code darin so wenig ist, dass es dafür nicht lohnt kann man's auch gleich in C schreiben.

Ansonsten fängst du dir evtl. ein paar Probleme ein. Du bist gerade daran das zum kompilieren zu bringen ohne wirklich viel Ahnung. Das ist in der Regel das geringste Problem. Wichtiger ist, dass es auch das gleiche tut. Z.b.

    std::vector<double> profil (1001,0);

ist eben nicht

        float profile[1001]

Der vector konstruktor initialisiert alles mit 0, was das float array nicht macht. Das kann je nach code, der das benutzt relevant sein.


Antwort
Zitat
Teilen: