Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Programmieren unter (Suse) Linux

Habe ein Problem, ich lerne grade programmieren und möchte diese Compilieren. Dies mache mit dem Befehl cc oder gcc darauf wird auch die gewünschte a.out.
Diese kann ich aber nicht öffnen auch mit alr+F2 und eigabe lässt sich da nichts dran rütteln!
Was habe ich falsch gemacht, bzw wie funktionierts richtig ???
Wäre über jeden Tipp dankbar !!!


Antworten zu Programmieren unter (Suse) Linux:

$ echo "int main(void){printf(\"Hallo Welt\");return 0;}">foo.c
$ make foo
gcc     foo.c   -o foo

$ ./foo
Hallo Welt
$

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Da würde ich mich auch gerne mit dranhängen:

Ich arbeite zZ zwar nciht mehr viel mit Linux, hatte aber das Problem, dass wenn ich eine Datei compiliere, diese nicht automatisch als "ausführbar" gekennzeichnet wird. Konnte also weder über das Terminal noch aus KDE raus mit "foo" mein Programm starten.
Gibt es da einen "Trick"?

Gruß Spawn

PS: @Fabian: Du kannst den von ..... erklärten Weg natürlich auch etwas abändern und die Datei foo.c im Texteditor o.ä. erstellen  ;)

Edit: Meinte natürlich ",,,,,", nicht "....."  ;D
Echt verwirrend  ???

« Letzte Änderung: 29.04.05, 16:18:26 von Spawn »
Ich arbeite zZ zwar nciht mehr viel mit Linux, hatte aber das Problem, dass wenn ich eine Datei compiliere, diese nicht automatisch als "ausführbar" gekennzeichnet wird.

Das Quoting ist 1:1 aus einer Shell kopiert...

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Mmh, dann mache ich wohl was falsch.
Hatte es zB mit Aurox versucht.
Da habe ich erst meine kleine test.c gebastelt, dann wie Du, gcc test.c -o test und das wars.

Moment, da fällt mir doch was auf: "make foo"? Ist das auf einer Zeile mit gcc (wegens fehlendem $ vor gcc)?
Und wichtig vielleicht auch noch?
Ich Drops....

Also, dass 'gcc' keine ausfuehrbare Dateien bauen soll, habe ich noch nie gehoert.

Ein paar Fehler fallen mir spontan ein:

1. Du kompilierst nicht mit 'gcc foo.c -o foo', sondern 'gcc -c foo.c -ofoo' ( dann wird kein Executable erstellt )

2. Du kompilierst richtig mit 'gcc foo.c -ofoo', versuchst dann aber auf der Shell: 'foo' auszufuehren - was nicht klappt, weil '.' nicht im Pfad liegt.

Zitat
Moment, da fällt mir doch was auf: "make foo"? Ist das auf einer Zeile mit gcc (wegens fehlendem $ vor gcc)
Das mit dem 'gcc ...' ist das, was 'make foo' ausgibt. Wenn kein 'Makefile' mit anderen Regeln im Verzeichnis liegt kompiliert 'make foo' halt mit Standardregeln aus einer vorhanden 'foo.c' oder 'foo.cpp'

hallo,
seit ihr mit der benutzeroberfläche von linux schon vertraut?

wenn ja, dann seit mir nicht böse, wenn ich euch den schritt zum erfolgreichen kompilieren so deteiliert beschreibe.

ich nehme an, dass ihr euer text editor mit "kwrite" über die konsole geöffnet habt.
1) nachdem ihr euer programm geschrieben habt,     speichert ihr es am besten mal auf dem desktop.

2) nun öffnet ihr die konsole und gebt erst einmal den pfad an wo eure txtdatei liegt. "cd Desktop"

3) nun startet ihr den compiler "gcc programmname -o programmname"

4) jetzt müsstet ihr da programm öffnen können
"./programmnama"

wenn ihr mit eurem programm die ports des rechners ansteuern wollt, müsst ihr eurem programm noch rootrechte geben.

















mal eine zwischenfrage

ich habe die ganze zeit in VisualC++ unter windows programmiert. nun will ich ein programm in linux zum laufen bringn.
es enthält eine tastaturabfrage. wenn ich z.B. eine pfeiltaste drücke, soll etwas ausgegeben werden, ohne dass ich zuvor enter drücken muss.

in VisualC++ habe ich dafür den befehl "kbhit()" benutzt.
unter dem GCC compiler läuft das nicht. kennt jemand einen alternativbfehl.

mit "getchar()" läuft es nur dann, wenn ich nach jeder eingabe auch die entertaste drücke. ich möchte es so haben, dass ich sobalt ich eine bestimmte taste drücke GLEICH etwas passiert.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Erstmal danke für die umfangreiche Beschreibungen (euch beiden). Eigentlich habe ich allerdings exaktemente Sokrates' Weg gewählt. Der einzige Unterschied war, dass ich das Programm nicht mit "./test" sondern mit "test" gestartet habe, ist das vielleicht der kleine aber feine Unterschied? Habe jetzt blöderweise kein Linux installiert um es zu versuchen.

Zu dem Tastenproblem: Ich hatte mal etwas in Unix gemacht und da habe ich das ganze (obwohl es sicher auch andere Wege gibt) mit folgendem gemacht:

fflush(stdin);
getc(stdin);

Kompiliert wurde das meines Erachtens auch mit gcc. Ja, da bin ich mir sehr sicher.
Allerdings hörte ich mal, dass es bei dieser Methode wohl Probleme geben _kann_, wegens dem "Tasten-Puffer" soweit ich mich errinere. Habe aber nie schlechte Erfahrungen gemacht.

Gruß Spawn

danke für deine antwort,
ich hoffe, dass es so funktioniert. es ist aber echt schwer genaue anweisungen zu diesem thema im internet zu finden.

ich werde es heute mal ausprobieren. wenn es noch fragen gibt, kann ich sie ja ins forum stellen.

gruß sokrates

@Spawn,

da bin ich auch mal drauf reingefallen... nenne niemals ein Programm test. Weil in bash is wohl n Befehl eingebaut der auch so heisst und immer Vorrang hat :-)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Uups, könnte das der Anstoß allen Übels gewesen sein?! Ich muss unbedingt mal wieder Linux installieren ums zu testen....

hallo spawn,
ich habe deinen vorschlag mal ausprobiert.
der compiler arbeitet zwar ohne probleme, doch ich würde gerne mal wissen, was dieser befehl macht.

fflush(stdin);
getc(stdin);

mfg michael

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Also, getc() bewirkt eigentlich das gleiche wie getchar(), von der technischen Seite gibt es vielleicht Unterschiede, aber das Resultat ist das gleiche. getc braucht allerdings eine Quelle, in dem Fall stdin, also die Standardeingabe, was dann (hoffentlich) die Tastatur ist.
Nun wird sich das aktuelle Zeichen aus dem Tastaturpuffer geholt. Nun kann es aber passieren, dass dieser Puffer nicht nur ein Zeichen enthält. Kennst Du vielleicht von QBasic oder alten Spielen: Wenn Du die ganze Zeit eine Taste drückst, dann damit aufhörst und eine andere drückst, wird erstmal eine ganze Zeit länger die erste Taste "registriert" und dann erst die zweite. (Hoffe, die Erklärung war schlüssig...)

Also wird vorher erstmal mit fflush(stdin) der Puffer gelöscht.

Gruß Spawn

Wenn man schon auf der Konsole Tasten abfragen möchte wie z.B. die Cursortasten, dann sollte man dafür einen Bibliothek wie Curses nehmen.

Denn die funktioniert auch mit anderen Terminals/Betriebssystemen/Telnet... während Sachen wie kbhit() in jeder Umgebung anders oder gar nicht funktionieren.

vielen dank für eure detailierten darstellungen.
ich hoffe, dass ich jetzt zurecht kommen werde.
ansonsten weiss ich ja wo ich mein problem schildern kann :-)

gruß sokrates

Hallo Leute,
ich komme einfach nicht weiter. Ich bitte euch meinen Quelltext zu compilieren und dann über die Konsole zu öffnen. Ihr werdet merken, dass das Programm zwar läuft, aber jeder eingegebener Befehl erst durch einen druck auf die Entertaste ausgeführt wird. (Mit diesem Programm, will ich ein Funkauto ansteuern.)
Nun der Quelltext:

# include <stdio.h>
# include <unistd.h>
# include <asm/io.h>

#include <sys/select.h>
#include <termios.h>
#include <stropts.h>
#include <curses.h>

/* mit diesem programm m?chte ich die lpt1 schnittstelle ansteuern
   die f?r die lpt1 ansteuerung n?tigen befehle habe ich auskommentiert.
   wenn ihr sie mit in das programm nehmt, m?sst ihr die ports freischalten.
   - ihr geht in den root modus und gebt:
      chown root:root namederdatei
      chmod a+s namederdatei
      exit
*/
int main()
 {
   //iopl(3);
   char taste;
   bool ende = false;

   while(ende != true)
   {
      fflush(stdin);
      if (getc(stdin))    //(kbhit()) hier liegt das problem
      {
         taste = getchar();

         switch(taste)
         {
         case 'w':

            //outb_p(132,0x378);
            printf("auto faehrt nach vorne");
            usleep(32);
            break;

         case 's':

            //outb_p(72,0x378);
            printf("auto faehrt nach hinten");
            usleep(32);
            break;

         case 'd':

            //outb_p(32,0x378);
            usleep(32);
            printf("auto faehrt nach rechtes");
            break;

         case 'a':

            //outb_p(1,0x378);
            printf("auto faehrt nach links");
            usleep(32);
            break;
         case 'x':

            //outb_p(0,0x378);
            ende=true;
            break;
         }

      }
      else
      {
            //outb_p(0,0x378);
      }   
   }
    return 0;
 }

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Nunja, das getc() hast Du ja eingebaut, benutzt dann aber trotzdem noch getchar()!! Probiers mal so:

int main()
{
   //iopl(3);
   char taste;
   bool ende = false;

   while(ende != true)
   {
      fflush(stdin);
      taste = getc(stdin);
      switch(taste)
      {
      case 'w':
         //outb_p(132,0x378);
         printf("auto faehrt nach vorne");
         usleep(32);
         break;
      case 's':
         //outb_p(72,0x378);
         printf("auto faehrt nach hinten");
         usleep(32);
         break;
      case 'd':
         //outb_p(32,0x378);
         usleep(32);
         printf("auto faehrt nach rechtes");
         break;
      case 'a':
         //outb_p(1,0x378);
         printf("auto faehrt nach links");
         usleep(32);
         break;
      case 'x':
         //outb_p(0,0x378);
         ende=true;
         break;
      default:
         //outb_p(0,0x378);
         break;
      }  
   }
   return 0;
}

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Uups, sorry, ich nehme alles zurück. Habs gerade mal getestet. getc() verlangt auch die Eingabetaste!! Tja, das war wohl nix.

Dann probier doch mal Curses aus (siehe ,,,,,'s Post). Das kannte ich bis jetzt noch nicht, aber klingt doch gut.

Gruß Spawn

#include <curses.h>

// compilieren mit 'gcc -o foo foo.c -lncurses'

int main( void )
{
   int quit = 0;
   
   // curses init
   initscr();
   cbreak();
   noecho();
   keypad(stdscr,TRUE); // corsor tasten zulassen
   
   atexit(endwin); // terminal restaurieren beim beenden

   while( !quit )
   {
      switch( getch() )
      {
         case KEY_DOWN:
            printw( "down\n" );
            break;
         case KEY_UP:
            printw( "up\n" );
            break;
         case KEY_LEFT:
            printw( "left\n" );
            break;
         case KEY_RIGHT:
            printw( "right\n" );
            break;
         case 'q':
            quit = 1;
            break;
         default:break;
      }
      doupdate(); // bildschirmausgaben updaten
   }
   
   return 0;
}

hallo leute,
vielen vielen dank vür euere hilfe. das programm läuft.

Sorry Freunde,
ich sehe gerade, dass ich mich ganz schön böse vertippt habe. Es sollte natürlich "für" heißen.
:-)

Gruß Sokrates

Hallo, ich habe eine Frage zu diesem Quelltext. Wie kann eine Abfrage einbauen: wenn eine Pfeiltaste gedrückt wird, dann soll etwas geschehen. ansonsten soll  irgendetwas ausgeben werden. (printf("bla…“);
Das Fettgedruckte soll meine Lösung darstellen.

Code:
#include <curses.h>

// compilieren mit 'gcc -o foo foo.c -lncurses'

int main( void )
{
   int quit = 0;
 
   initscr();
   cbreak();
   noecho();
   keypad(stdscr,TRUE);
   
   atexit(endwin);

   while( !quit )
   {
     if(getch())   //hier liegt das problem
      {

      switch( getch() )
      {
         case KEY_DOWN:
            printw( "down\n" );
            break;
         case KEY_UP:
            printw( "up\n" );
            break;
         case KEY_LEFT:
            printw( "left\n" );
            break;
         case KEY_RIGHT:
            printw( "right\n" );
            break;
         case 'q':
            quit = 1;
            break;
         default:break;
      }

      else
      {
        printf("bla...");
       }
      doupdate(); // bildschirmausgaben updaten
   }
   
   return 0;
}

Was tut wohl das hier:

switch( getch() )
      {
        case KEY_DOWN:
            printw( "down\n" );
            break;
        case KEY_UP:
            printw( "up\n" );
            break;
        case KEY_LEFT:
            printw( "left\n" );
            break;
        case KEY_RIGHT:
            printw( "right\n" );
            break;
        case 'q':
            quit = 1;
            break;
        default:break;
      }

Jetzt versuche mal irgendwie zu erraten, was passiert, wenn eine Pfeiltaste gedrückt wird. Wenn Du meinst, die Lösung zu haben, dann versuch mal zu erraten, was passieren könnte, wenn man 'q' eintippt. Wenn Du das schliesslich erraten hast, dann könnte wohl die Masterfrage lauten: Was passiert, wenn irgendetwas anderes gedrückt wurde...  ::)

BTW.: mit NCURSES niemals printf, sondern printw  :P

Danke für den Hinweis mit printw(" "). Eigentlich kenne ich mich kaum mit der c Programmierung unter Linux aus. Ich programmiere fast ausschließlich unter Windows (Visual C++).

Was du mir probiert hast deutlich zu machen, habe ich  (hoffentlich) verstanden. Ich hatte  ursprünglich vor gehabt die parallele Schnittstelle zu programmieren. (das ist mir unter Windows auch gelungen.)
Wenn ich nun eine Pfeiltaste drücke, und sie danach wieder los lasse, wird die Ausgabe printw(„nach vorne“) nicht gleich beendet.
Also möchte ich:
Solange wie ich eine Pfeiltaste drücke, soll ein Befehl ausgegeben werden.

Ich dachte mir, dass dies durch eine if Abfrage vor dem switch/case bewerkstelligt werden kann. Mir fehlt nur der entsprechende Befehl für den if-Block.

Gruß Michael

Zur Verdeutlichung:
wenn ich die Pfeiltaste gehenlasse, sollen die Portausgänge auf Null gesetzt werden.


« Turbo-Pascal Problem.....Programmbibliothek für XP-Systemzugriffe gesucht »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...

Unicode
Unicode ist ein international anerkannter Standard, der als universeller Zeichencode ("Universal Code") dient und durch das Unicode-Konsortium entwickelt und verwaltet wi...

QR-Code
QR-Codes, die Abkürzung für "Quick Response Codes", sind eine Form von zweidimensionalen Barcodes. Damit lassen sich Informationen schnell und effizient speiche...