» error: redeclaration of ‚raw’ with no linkage

Excel-Funktion NORM.S.VERT in cNeuen Thread eröffnenNeue Antwort erstellenSchleife Beenden
AutorNachricht
Beobachter 
Anmeldedatum: 30.11.2019
Beiträge: 0
30.11.2019, 10:43
zitieren

Hallo, aus einem Internet-Tutorial habe ich folgendes abgetippt

#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
struct termios orig_termios;
void disableRawMode() {
tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios);
}
void enableRawMode() {
tcgetattr(STDIN_FILENO, &orig_termios);
atexit(disableRawMode);
struct termios raw = orig_termios;
raw.c_lflag &= ~(ECHO);
tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw);

int main() {
enableRawMode();
char c;
while (read(STDIN_FILENO, &c, 1) == 1 && c != 'q');
return 0;
}


Ich habe es compiled unter Unix mit:
cc kilo.c -o kilo

Terminal zeigt dann folgendes an:
error: redeclaration of ‚raw‘ with no linkage
struct termios raw = orig_termios;


Das raw ist rot unterkringelt. Was ist falsch?
Vielen Dank


pn
Trainee 

Name: Mirko
Geschlecht:
Anmeldedatum: 06.12.2019
Beiträge: 46
Wohnort: Weingarten
08.12.2019, 15:41
zitieren

Hallo,

was dieser Code genau tut oder tun soll kann ich zwar nicht sagen, jedoch fehlt bei der Funktion "void enableRawMode()" die abschließende, geschweifte Klammer.
Bei mir jedenfalls scheint das Programm zu laufen (unter Linux). Lässt sich ohne Warnungen und Fehlermeldungen kompilieren. Auch wenn sich mir die Funktionalität nicht erschließt. :)


pn
Junior 
Name: Voller Name als Anagramm: Fitje Weshoms
Geschlecht:
Fahrzeug: Yamaha YZF R6 Thundercat
Anmeldedatum: 15.07.2012
Beiträge: 92
Wohnort: Amberg, Oberpfalz
25.12.2019, 18:21
zitieren

Hallo,

scheint was mit der Programmierung eines Terminals zu tun haben:

https://viewsourcecode.org/snaptoken/kilo/02.enteringRawMode.html

https://linux.die.net/man/3/tcsetattr

Grundsätzlich unterscheidet man beim Terminal-IO zwei Arten:

kanonischer Modus: (cooked mode) Hier erfolgt das Lesen und Schreiben auf das Device zeilenorientiert. Eine Eingabe wird erst weitergereicht, wenn ein Zeilenabschluss (Linefeed, NL) oder Carriage Return (CR)) übertragen wurde. Für diesen Mode benötigt man die Steuerzeichen des c_cc-Arrays. Ein Programm wartet beim Lesen in diesem Modus so lange, bis tatsächlich eine komplette Zeile empfangen wurde. Wird kein Zeilenabschluss gelesen, so wird für immer und ewig gewartet. Die Aufgabe des Zwischenspeicherns übernimmt der Kernel.

nichtkanonischer Modus: (raw mode) Hier wird nicht zeilenweise gelesen, sondern entweder auf eine bestimmte Anzahl von Bytes gewartet oder nach einer gewissen Zeit die bis dahin eingetroffenen Bytes abgeliefert. Hierfür müssen zwei Felder des Arrays c_cc gesetzt werden. In c_cc[VTIME] wird die Wartezeit in Zehntelsekunden und in c_cc[VMIN] das Minimum der zu lesenden Bytes angegeben. Die folgenden vier Konstellationen sind denkbar:

1. Fall: c_cc[VTIME] > 0 und c_cc[VMIN] > 0
read() liefert MIN Bytes, bevor die Zeit TIME abläuft oder read() liefert weniger als MIN Bytes, weil die Zeit TIME abgelaufen ist. Sind noch keine Daten empfangen worden, wartet read() auf min. ein Byte. Wenn das erste Byte gelesen wurde, läuft der Timer los, wobei jedes ankommende Byte den Timer wieder neu startet. Diese Methode ist günstig, wenn man große Datenmengen lesen, aber auch auf einzelne Zeichen reagieren muss. Aber es kann eine Blockierung stattfinden.

2. Fall: c_cc[VTIME] = 0 und c_cc[VMIN] > 0
read() liefert mindestens MIN Bytes, sobald diese eingetroffen sind. Dieser Modus ist günstig, wenn möglichst viele Bytes mit einem read() gelesen werden sollen. Andererseits kann man auch auf ein einziges Byte reagieren (MIN = 1). Ist MIN größer als die Anzahl der bei read() angegebenen Zeichen, wird gewartet, bis MIN Bytes gelesen, aber nur n Bytes an read() geliefert wurden; ein zweites read() liefert dann den Rest. Auch hier kommt es zur Blockierung, wenn nicht genügend Bytes eintreffen.

3. Fall: c_cc[VTIME] > 0 und c_cc[VMIN] = 0
Diese Einstellung erlaubt es, das Lesen mit Timeout zu programmieren. Sobald ein Byte eintrifft, liefert read() dieses ab. Wenn die Zeit TIME seit dem Aufruf von read() verstrichen ist, liefert read() 0 (gelesene Bytes) zurück.

4. Fall: c_cc[VTIME] = 0 und c_cc[VMIN] = 0
read liefert die Anzahl Bytes, die anliegen. Sind keine Daten vorhanden, wird sofort 0 (gelesene Bytes) zurückgegeben. Der Treiber wartet also niemals auf Daten, sondern kehrt immer sofort zurück.

Anscheinend ist beim cooked mode eine Art Präprozessor vorgeschaltet, der die Eingaben verarbeitet.
Das Programm schaltet auf den noncanonical mode, also raw mode.


 1x  bearbeitet
pn
Trainee 

Name: Mirko
Geschlecht:
Anmeldedatum: 06.12.2019
Beiträge: 46
Wohnort: Weingarten
26.12.2019, 06:40
zitieren

Hallo Guiseppe,

eine Erklärung wie Du sie geliefert hast, hätte ich eigentlich vom Fragesteller selbst erwartet. Aber danke Dir für diese Ausführlichkeit.

Schöne Feiertage noch...


pn
Junior 
Name: Voller Name als Anagramm: Fitje Weshoms
Geschlecht:
Fahrzeug: Yamaha YZF R6 Thundercat
Anmeldedatum: 15.07.2012
Beiträge: 92
Wohnort: Amberg, Oberpfalz
26.12.2019, 17:14
zitieren

[quote="steinsgate"]Hallo!

tcgetattr() wird eigentlich nach dazu verwendet die RS232-Schnittstelle einzurichten, welche man
früher verwendete. Ausserdem

kann man sich damit die Funktion getch(), getche und kbhit()
für Linux selber basteln:


#ifndef GETCH_H_INCLUDED
#define GETCH_H_INCLUDED

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h> //for new version of kbhit
//#include <sys/time.h> old version

/// reads from keypress, doesn't echo
int getch(){
    struct termios oldt, newt;
    int ch;
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return ch;
}

void clpuf(void)
 {
 while (getc(stdin) != '\n')
    ;
 }

   /// reads from keypress, echoes
int getche(void)
    {
    struct termios oldattr, newattr;
    int ch;
    tcgetattr( STDIN_FILENO, &oldattr );
    newattr = oldattr;
    newattr.c_lflag &= ~( ICANON );
    tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
    return ch;
    }
/*old:

// braucht Bestätigung mit Enter-Taste
long kbhit(void)
{
struct timeval tv;
fd_set read_fd;

tv.tv_sec=0;
tv.tv_usec=0;
FD_ZERO(&read_fd);
FD_SET(0,&read_fd);

if(select(1, &read_fd, NULL, NULL, &tv) == -1)
return 0;

if(FD_ISSET(0,&read_fd))
 return 1;

return 0;
}
*/

// braucht keine Bestätigung mit Enter-Taste
int kbhit(void)
{
  struct termios oldt, newt;
  int ch;
  int oldf;
 
  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
 
  ch = getchar();
 
  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);
 
  if(ch != EOF)
  {
    ungetc(ch, stdin);
    return ch;  // Normalerweise 1, aber besser ch, so hat man gleich den ASCII-Wert;
  }
 
  return 0;
}
#endif // GETCH_H_INCLUDED

Eigentlich sollte man keine Funtktionsdeklaration in eine header-Datei packen.
Hier nur der Einfachheit halber.
Hier zum Beispiel ein Anwendungsbeispiel für kbhit:

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

int kbhit(void)
{
  struct termios oldt, newt;
  int ch;
  int oldf;
 
  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
 
  ch = getchar();
 
  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);
 
  if(ch != EOF)
  {
    //ungetc(ch, stdin);
    return ch;
  }
 
  return 0;
}
 
void clpuf(void)
 {
 while (getc(stdin) != '\n')
    ;
 }
 

int main(void)
{
  int letter= 0;

while((letter = kbhit()) != 32)
  {
   //if (letter != 0) clpuf();
    printf("Press a key: %d\n", letter);
   }
   printf("You pressed '%c'= %ddez\n", letter,letter);
 
 return 0;
}

Hier muss man die Leertaste drücken, um das Programm zu beenden.


pn
Gast 
26.12.2019, 17:14
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "error: redeclaration of ‚raw’ with no linkage" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
Übersetzung Fehler: PA51 B1235 "A Problem in the Driver's Air Mix Control Linkage, Door, or Motor"
Hallo, bin zwar des Englischen mächtig, aber was ist hier genau gemeint? - ein Fehler im Bereich der Ansaugluft des Motors? - Luftmassensensor? - welche "Tür" ist da gemeint? - warum explizit dieses "Drivers" bei ir mix...
von Kneckes
0
195
14.05.2020, 09:22
Kneckes
CD ERROR
Ich fahre fast seit 1 Jahr auch FR-V.Mein Radio will aber keine CDs mehr abspielen.Die Anzeige:CD Error.Ist ein 6-fach Wechsler.Die Garantie ist vor 10 Monaten abgelaufen.Habe bei Honda gefragt:2300 Neu. Kann ich das Problem auf eine andere Weise...
von chza69
7
540
25.01.2009, 00:26
DYSCHA
HTTP Error 500
...
von Eg9 racer
23
434
21.10.2016, 05:22
Milos von D.
VirtualBox - Error in supR3HardenedWinReSpawn
Ich starte gerade eine bestehende VM und bekomme den folgenden Fehler: VirtualBox - Error in supR3HardenedWinReSpawn Error relaunching VirtualBox VM process: 5 Command line: '81954AF5-4D2F-31EB-A142- B7AF187A1C41-suplid-2ndchild --comment ubuntu...
von mgutt
3
737
11.09.2014, 19:30
mgutt
GD1 CD Radio Fehler : ERROR
Hallo Leute Wer kann mir helfen? Ich habe seit einer Woche ein Problem mit dem Standardradio im Jazz GD1 (Audioanlage Typ B). Das Radio spuckt keine CD mehr aus. Man muss schon 20 x auf Auswerfen drücken um die CD wieder raus zu bekommen. Es kommt...
von nils_cl
7
788
26.07.2012, 09:11
wund
Error 500 bei Mitglieder-Profilen
...
von &weida?
3
268
20.04.2017, 15:10
mgutt
Internal Error: Installationproblem bei Mediawiki
Hallo, ich benötige dringend Hilfe mit meinen MediaWiki. Bei der Installation erscheint folgender Fehler: [cf0f6cc3] [no req] Exception from line 61 of /data/multiserv/users/1289248/projects/2707382/www/mediawiki-1.24.1/includes/WebRequest.php: MediaWiki...
von GloriaLu
1
113
08.02.2015, 14:26
mgutt
Extension Error bei externem Zugriff
Hallo zusammen, ich habe ein Problem mit der Extension SyntaxHighlight_GeSHi Ich habe im Intranet ein Wiki aufgesetzt das innerhalb des Netzwerkes auch ohne Probleme mit der Extension funktioniert. Sobald ich aber versuche von außerhalb über Dynamische...
von BarneyG77
0
38
19.09.2015, 19:19
BarneyG77
Mediawiki-Update 1.17.0: Database error
im Rahmen eines Joomla-Accounts (www.les-frankfurt.de) hat unsere Schule parallel eine Mediawiki-Installation (wiki.les-frankfurt.de), die ich gestern von Version 1.14.x auf 1.17.0 updaten wollte; was auch - soweit ich der installationsroutine glauben...
von oszorro
6
791
03.08.2011, 15:31
carchaias
Alpine CDE 111R DC Error Problem
Hallo Zusammen! In meinem bmw e30 war als ich Ihn gekauft habe ein Blaupunkt Trier CC31 eingebaut. Da ich die letze Zeit viel gemacht habe wollte ich mich jetzt mal um das Radio kümmern. Das Sound war für mich völlig okay, allerdings wollte ich...
von Meerjungfraumann88
0
2.578
27.05.2011, 13:57
Meerjungfraumann88
© 2004 - 2025 www.programmierer-forum.de | Communities | Impressum |