C Compiler unter Win

Gast #3782459
Lesenswert?

Hallo

ich programmiere zur Zeit einen Roboter auf STM32 Basis, ARM, GCC.
Dieser soll sich in einem Raum auf eine bestimmte Art bewegen. Das 
Austüfteln dieser Algorithmen will ich aber nicht auf dem uC entwickeln.

Also dachte ich: Ich schreib diese Programmteile in reinem C auf einem 
PC und simuliere die Roboterbewegung. Also ein PC Programm mit einer 
sehr einfachen GUI das mir den Raum von oben zeigt und die Position des 
Roboters.

Schnittstelle sollte etwa so sein: Drehe x Grad, Fahre 500 Steps mit 
Geschwindigkeit x. Die Simulation auf dem PC sollte das dann ausführen.

Nun komme ich aber aus der Linux / Java Ecke und kenne die C IDEs nicht.

Anforderungen wären:
- C Programm sollte später einfach auf ARM portierbar sein. Deshalb C 
und kein C++/C#
- Einfache GUI bzw. "Canvas" zum zeichnen
- Entwicklungsrechner ist ein älterer, eher langsamer XP Laptop.

Habt Ihr einen Tipp, was man da nehmen kann?
#3782469
Lesenswert?

QT, QT Creator als IDE:
https://qt-project.org/

Visual Studio Express:
http://www.microsoft.com/de-de/download/details.aspx?id=40787

Code::Blocks mit MinGW und wxWidgets:
http://www.codeblocks.org/

Eclipse CDT + MinGW und QT/wxWidgets:
https://www.eclipse.org

für die letzten beiden muss man MinGW per Hand einrichten:
http://www.mingw.org/

MinGW 64Bit+32Bit:
http://tdm-gcc.tdragon.net/
Gast #3786630
Lesenswert?

Hallo,

bin vielleicht etwas spät dran, will aber unbedingt Pelles C 
(http://www.smorgasbordet.com/pellesc/) empfohlen haben.

Vorteile:

- unterstützt C99 und C11

- unterstützt Microsoft Erweiterungen (d.h. falls du Bibliotheken 
brauchst, kannst du .LIBs nutzen, also Bibliotheken die mit MSVC++ statt 
mit gcc kompiliert wurden)

- eingebauter Resourceneditor

- gibts nativ in 32 oder 64 Bit (das letzte mal als ich einen 64 Bit gcc 
und 64 Bit Qt brauchte, sah es schlecht aus; ist allerdings auch schon 
etwas her)
Gast #3789545
Lesenswert?

Jens schrieb:
> - C Programm sollte später einfach auf ARM portierbar sein. Deshalb C
> und kein C++/C#
C++ und C# sind zwei völlig verschiedene Dinge, daher ist "C++/C#" 
ziemlicher Unsinn. C++ ist standardisiert, und wenn du 
standard-konformen Code schreibst ist dieser perfekt portabel. Mehr als 
Java oder C#, und mindestens so wie C. In C++ ist es allerdings 
komfortabler:
In C portabel einen 32bit-Integer ausgeben:
1
int32_t x = 42;
2
printf ("Die Zahl ist " PRId32 ".", x);
In C++:
1
int32_t x = 42;
2
std::cout << "Die zahl ist " << x << ".";
Wenn man nachträglich den Typ auf zB uint16_t ändert, muss man in C 
jegliche Ausgabe auf PRId16 ändern. In C++ muss man gar nichts ändern.
Gast #3789760
Lesenswert?

Gustav schrieb:
> Erzähl mal!
Java ist nur für 32bit-Plattformen konzipiert, denn dessen "int" 
Datentyp muss immer 32bit groß sein. Auf einer 36bit oder 25bit 
Plattform müssen diese erst kompliziert (und langsam) emuliert werden. 
In C++ ist dann ein "int" halt 25bit groß, portabler Code sollte sich 
nicht daran stören. Außerdem sind in Java Array-Indices immer "int", 
d.h. 32bit - daher kann Java nur 4GB-Arrays anlegen, auch wenn die 
Plattform mehr könnte (wie zB x86_64). In C++ kein Problem, denn dort 
verwendet man size_t für Array-Größen & Indices, was je nach Plattform 
zB 32 oder 64bit groß ist.

C++ Code passt sich also der Plattform an um dort direkt effizient zu 
laufen, während Java Anforderungen stellt die bei weitem nicht immer 
effizient erfüllbar sind, weswegen es auch gar keine JVM's auf solchen 
Plattformen gibt.
Gast #3790285
Lesenswert?

Gustav schrieb:
> Java hat auch kein Problem damit, weil die JVM auch auf deinen
> exotischen Gedankenspiel-Rechnern korrekte Datentypen bereitstellen
> kann.
1. sind die keineswegs Gedankenspiele und 2. geht das nur sehr 
suboptimal und ineffizient. Theoretisch lässt sich jede Sprache auf 
jeder Plattform nutzen solange sie turing-vollständig ist (weswegen die 
Portabilitäts-Diskussion theoretisch hinfällig ist); praktisch bereitet 
aber die aus Java's Inflexibilität resultierende Ineffizienz derartige 
Probleme dass das nicht sinnvoll machbar ist.

Und wie du vielleicht weißt ist x86_64 (AMD64) keine besonders exotische 
Architektur, und dennoch kann Java dessen kompletten Speicher nicht 
ausnutzen aufgrund der 32bit-Array-Größe & Indices.

Die Logik ist ganz einfach: Die Menge an Plattformen auf denen Java 
sinnvoll läuft ist eine echte Teilmenge der Plattformen auf denen C(++) 
sinnvoll läuft, ergo ist C(++) portabler als Java. Da kannst du auch 
nichts durch Herunterspielen von dir nicht passenden Plattformen dran 
ändern.
Gast #3790288
Lesenswert?

Boris P. schrieb:
> Dr. Sommer schrieb:
>> Java und sein Zwangs-8bit-"char".
>
> Ist doch gut, dann läuft der Code so wie man es erwartet (und ist nicht
> abhängig von der Platform).
Korrekter C(++) Code ist nicht abhängig von der Plattform, denn dieser 
erwartet nicht dass ein char 8bit groß ist, denn das ist in den C und 
C++ Standards nirgends garantiert!
#3790300
Lesenswert?

Dr. Sommer schrieb:
> Und wie du vielleicht weißt ist x86_64 (AMD64) keine besonders exotische
> Architektur, und dennoch kann Java dessen kompletten Speicher nicht
> ausnutzen aufgrund der 32bit-Array-Größe & Indices.

Warum sollte man ein Array definieren wollen, dass den ganzen Speicher 
des Systems ausnutzt? Wenn du tatsächlich Daten in der Größenordnung 
ablegen willst, wirst du auch eine sinnvolle Datenstruktur brauchen.
Und ja, das geht mit java problemlos. Und damit kann man ohne weiteres 
hunderte von GB an Speicher vollklatschen, wenn man das möchte...
Gast #3790309
Lesenswert?

Boris P. schrieb:
> Warum sollte man ein Array definieren wollen, dass den ganzen Speicher
> des Systems ausnutzt?
Weil niemand mehr als 640KB RAM braucht? Java ist einfach nicht 
aufwärts/Zukunfts-Kompatibel, wenn es quasi überall 32bit-Integer 
vorschreibt. Selbst im viel älteren C hat man begriffen, dass man für 
Array Größen & Indices einen flexiblen Datentyp braucht (size_t).
Im Java's altem Datei-API wurden 32bit-Integer sogar für Dateioffsets 
verwendet, d.h. man konnte nur maximal 2 GB große Dateien anlegen. Aber 
wer hat schon Festplatten in der Größe, gell. Zum Glück haben sie dafür 
jetzt ein neues API. Arrays sind aber Bestandteil der Sprache und daher 
nicht so leicht zu ändern. Wenn die üblichen RAM-Größen & Bedarf ähnlich 
weiterwachsen wie Festplatten, werden die 32bit auch irgendwann zu 
Problemen führen...
#3790312
Lesenswert?

Dr. Sommer schrieb:
> Weil niemand mehr als 640KB RAM braucht?

Du vielleicht nicht. Ich stoße mit meinen 16GB schon manchmal an 
Grenzen... ;-)

Dr. Sommer schrieb:
> Weil niemand mehr als 640KB RAM braucht? Java ist einfach nicht
> aufwärts/Zukunfts-Kompatibel, wenn es quasi überall 32bit-Integer
> vorschreibt.

Java gibts doch auch als 64bit Version. Damit kommt man 
speichertechnisch recht weit.
Gast #3790314
Lesenswert?

Boris P. schrieb:
> Java gibts doch auch als 64bit Version. Damit kommt man
> speichertechnisch recht weit ;-)
Aber da ist "int" immernoch 32bit groß. Das ist ein prinzipielles 
Problem der Sprache, das man nicht durch bessere JVM's lösen kann, 
sondern nur durch Re-Design der Sprache selbst.
#3790348
Lesenswert?

Dr. Sommer schrieb:
> Aber wie groß ein Array sein kann. Versuche mal ein Array mit mehr als
> 2^31 Einträgen anzulegen.

So what? Einen praktischen Nutzen hat sowas nicht => Braucht kein Mensch 
:-)

Du willst ja nicht Daten zum Selbstzweck speichern. Du willst sie 
durchsuchen, ändern, hinzufügen und entfernen können. Und dazu taugt ein 
Array mit 4294967297 Einträgen nun wahrlich nicht. Da wäre dann eine 
Baumstruktur o.Ä. angemessen.
Gast #3790357
Lesenswert?

Boris P. schrieb:
> Da wäre dann eine
> Baumstruktur o.Ä. angemessen.
Die könnte man da hineinspeichern (Heap-Struktur). Wäre effizienter als 
1000000x "new" aufzurufen und Referenzen zu verwenden.

Boris P. schrieb:
> So what? Einen praktischen Nutzen hat sowas nicht => Braucht kein Mensch
> :-)
Genau wie die 640 KB RAM - braucht auch keiner - noch nicht. Es ist 
wie gesagt ein prinzipielles Problem, was u.a. darin begründet ist dass 
Java keine Typ-Aliase hat. Aber all das ändert immer noch nicht die 
Tatsache, dass C(++) portabler als Java ist.
Gast #3790432
Lesenswert?

Ob euer Gefeilsche um ein wenig mehr Performance dem TE wirklich 
weiterhilft? Der wollte doch ausdrücklich C und KEIN C++ und wohl auch 
kein Java, obwohl er das bereits kennt?

Gibt es überhaupt eine Möglichkeit die QT Widgets zu verwenden bei 
REINEM C Code? Meiner Kenntnis nach nicht.
Persönliche Seite #3790459
Lesenswert?

C C++ oder was schrieb:
> Gibt es überhaupt eine Möglichkeit die QT Widgets zu verwenden bei
> REINEM C Code?

Nö, es sei denn, man bastelt sich eine DLL, die den QT-Krempel kapselt 
und ein C-Aufrufinterface bietet.

Aber das entfernt sich immer weiter von dem, was der Threadstarter wohl 
will.

Der aber hat sich seit mehreren Tagen hier nicht mehr blicken lassen.
Gast #3790461
Lesenswert?

Dr. Sommer (Gast) schrieb:
> Der Punkt ist, dass er bezüglich der Begründung für "kein C++" scheinbar
> einem Mythos aufgesessen ist.

Weiß ich nicht. Ich denke viele wie der TE tun sich eher schwer mit der 
Syntax von C++ zurechtzukommen.
1
    class MyWidget : public QVBox
2
    {
3
    public:
4
        MyWidget( QWidget *parent=0, const char *name=0 );
5
    };
6

7
    MyWidget::MyWidget( QWidget *parent, const char *name )
8
            : QVBox( parent, name )
9
    {

Ist halt doch was anderes als C.
Gast #3790469
Lesenswert?

Rufus Τ. Firefly (rufus) (Moderator) schrieb:

C C++ oder was schrieb:
>> Gibt es überhaupt eine Möglichkeit die QT Widgets zu verwenden bei
>> REINEM C Code?

> Nö, es sei denn, man bastelt sich eine DLL, die den QT-Krempel kapselt
> und ein C-Aufrufinterface bietet.

Danke! Konnte auch bisher nichts brauchbares im Netz finden. Es wird dem 
Geneigten wenn es um QT geht einfach zu oft C++ als "C" untergeschoben.

> Aber das entfernt sich immer weiter von dem, was der Threadstarter wohl
> will.

> Der aber hat sich seit mehreren Tagen hier nicht mehr blicken lassen.

Tippe mal auf typische Reaktion "verschreckt". ;)

Ist doch eigentlich ein spannendes Thema.
Gast #3790484
Lesenswert?

Rufus Τ. Firefly (rufus) (Moderator) schrieb:

> Nein, dem Thredstarter geht es nicht um die Syntax, sondern er nimmt an,
> daß es Probleme mit der Portierung von C++ - Code auf einen ARM geben
> wird.

> Hier wird ja noch oberflächlicher gelesen, als ich das an schlechten
> Tagen hinbekomme ...

Verstehe ich nicht. Ich habe es so verstanden, dass er auf dem PC die 
GUI zur Simulation benötigt. Was also hat dieser Teil des Codes mit dem 
Programmcode eines Mikrocontrollers ARM in Sachen "Portierung" zu tun? 
Das sind doch zwei Paar Schuhe.

ARM: C-Code
PC: C++ GUI  (will er nicht)

ARM: C-Code
PC: (auch nur Code in) C GUI (will er)

SO habe ich das verstanden.
Gast #3790550
Lesenswert?

Als ich so um '98 Simulationen mit grafischer Ausgabe unter Windows in C 
geschrieben habe, war das glaub ich direkt mit den Funktionen der gdi 
und user DLLs (damals noch 16 Bit Code). Zum Zusammenklicken der Dialoge 
hatte MSVC++ einen Ressourcen Editor. Die MFC habe ich definitiv nicht 
verwendet.

Heutzutage würde ich zu Mingw greifen und mir irgendwo anders einen 
grafischen Ressourcen Editor beschaffen, wenn Dialoge überhaupt benötigt 
werden.
Moderator #3790598
Lesenswert?

Falls du es nicht schon getan hast, kannst du darüber nachdenken, die
Roboter- und die Simulationssoftware in getrennten Programmen laufen
lassen, die untereinander über Sockets kommunizieren.

Damit bist du zum einen in der Wahl der Programmiersprache für
die Simulation und das GUI völlig frei.

Zum anderen ist es ohne allzu viele Änderungen möglich, eine ähnliche
Kommunikationsschnittstelle (über TCP-Sockets oder UART) zwischen PC und
realem Roboter (ARM) einzurichten, und es ergeben sich mehrere mögliche
Testkonfigurationen für die Robotersoftware:

- Roboteralgorithmen auf PC    <--->  Simulation/GUI auf PC
- Roboteralgorithmen auf PC    <--->  realer Roboter mit ARM
- Roboteralgorithmen auf ARM   <--->  Simulation/GUI auf PC
- Roboteralgorithmen auf ARM   <--->  realer Roboter mit ARM

Zudem können, falls die Rechenleistung eines einzelnen PCs oder ARMs
nicht ausreichen sollte, die Roboteralgorithmen und die Simulation bzw.
die Low-Level-Robotersteuerung problemlos auf verschiedenen Rechnern
laufen:

- Roboteralgorithmen auf PC1   <--->  Simulation/GUI auf PC2
- Roboteralgorithmen auf ARM1  <--->  realer Roboter mit ARM2

Je nachdem, was getestet werden soll, hat jede dieser Konfigurationen
ihre Vor- und Nachteile. Glücklich ist der, der aussuchen kann :)
Gast #3790817
Lesenswert?

Das ganze Theater mit sockets und DLLs ist nicht nötig - man kann 
Objectfiles von einem C Compiler mit Objectfiles von einem C++ Compiler 
zusammenlinken. Der C++ Compiler braucht noch ein extern "C" in der 
Schnittstellendeklaration.

Geht besser, als Objectfiles von 2 verschiedenen C++ Compilern :-)

Damit kann man dann die GUI in C++ machen, und das zu testende Programm 
in C.

Alternativ, auch die GUI in C:
- Irgendein C-Compiler - hat nichts mit der GUI zu tun
  (wenn die GUI-Bibliothek keine besonderen Anforderungen stellt).
- Eine GUI-Bibliothek aussuchen. Mir fallen z.B. ein:
  - IUP (sehr einfach, Plattformunabhängig)
  - Win32 (etwas komplizierter...)
  - gtk (Tut auch auf Windows, obwohl es von Unix kommt)
Gast #3790820
Lesenswert?

Rufus Τ. Firefly (rufus) (Moderator) schrieb:

C C++ oder was schrieb:
>> SO habe ich das verstanden.

> Aha:

>> Anforderungen wären:
>> - C Programm sollte später einfach auf ARM portierbar sein.
>>   Deshalb C und kein C++/C#

Nix "Aha". Er hat es ja jetzt nochmals präzisiert

ARM: C-Code
PC: C++ GUI in WxWidgets ; Algorithmen in C

Ob WxWidgets gegenüber Qt Vorteile hat wäre dann nochmals eine andere 
Frage. Aber das muss er selber wissen. Gibt außerdem auch noch andere 
GUI Toolkits.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren