Nicht der Inhalt war nicht gut, sondern die Art der Formulierung in zusmmenhang mit dem Usernamen...
aber wenn ich das ganze aus einem etwas zynischem Blickwinkel betrachte verstehe ich auch was du damit ausdrücken wolltest....
Nagut Kritik angenommen
Habe die beiden Funktionen zwar getestet, doch bei der ersten Funktion
irq_table[intnr] = int_handler();
bekomme ich zunächst “not allowed here“
aber auch mit einer Änderung in der Form
irq_table[intnr] = int_handler;
oder mit dem zweiten Beispiel erhalte ich da keinen Interrupt installiert (wenn auch sonst nichts abstürzt).
Ich hatte mich aber, da ich “interrupt“ ja eh nicht gelinkt bekomme (undefined DGROUP@) inzwischen eigentlich auch dazu entscheiden, eine Interruptfunktion ohne “interrupt“ zu schreiben und sie ohne setvect zu ersetzen, was sicherer ist, denn das muß (irgendwie) auf jeden Fall gehen (aber wie?).
Denn mit “interrupt“ definiert der Compiler immer ein:
_TEXT segment byte public 'CODE'
extrn DGROUP@:word
_TEXT ends
das dann in die Interruptfunktion zu Beginn mit
mov bp,cs:DGROUP@
mov ds,bp
mov bp,sp
sub sp,2
eingebaut wird und beim Linken natürlich fehlt.
Was dieses DGROUP ist (Segment oder Offset) und wo es liegt ist mir dabei nicht klar. Es taucht auch noch in Formen wie
DGROUP group _DATA,_BSS
assume cs:_TEXT,ds:DGROUP
und
mov dx,word ptr DGROUP:_SERIALPORT
auf.
Eine normale void-Funktion bekomme ich andererseits leider nicht so einfach als “interrupt“ um-gecastet.
pencil schrieb:
SourceCode?
Findet sich genug im Netz, zB hier: http://www.codeproject.com (Suche nach ftp client liefert genügend Material).
Allerdings rate ich dir vorher das Prinzip von Scokets zu verstehen.
MfG SideWinder
Irgendwie wird mir dein Problem nicht ganz klar, aber einige Ansätze:
Zeile aus Datei machst du doch schon (genau das ist die Aufgabe von getline).
while(f.getline(buffer)!=EOF)
process(buffer);
(bei der Abbruchbedingung bin ich mir nicht ganz sicher, aber in der Dokumentation von getline() sollte drinstehen, was er bei EOF zurückgibt)
switch-case:
cout << "[1] Befehl 1" << endl;
//...
int sel;
cin >> sel;
switch(sel)
{
case 1:
do_command1();
break;
case 2:
do_command2();
break;
//...
default:
cout<<"Falsches Kommando"<<endl;
}
Soweit funktioniert es. Allerdings ist diese Form nicht wirklich benutzerfreundlich, schöner wäre es lediglich ein Programm zu haben, welches den Benutzer beim ersten ausführen (oder wenn die config Datei leer ist) fragt, ob er eine neue erstellen möchte.
Du hast doch im Ausführungsprogramm schon die Überprüfung, ob die Config-Datei vorhanden ist. Dort kannst du einfach statt der Fehlermeldung ("Config nicht gefunden") einen Aufruf einer Hilfsfunktion einbauen, das die Arbeit des Konfigurationsprogramms übernimmt.
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum DOS und Win32-Konsole verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?
Dieses Posting wurde automatisch erzeugt.
Bashar schrieb:
user4711 schrieb:
Dabei finde ich in dos-16.c den lapidaren Hinweis:
'Note: use of 'interrupt' keyword may cause TLINK error
"Cannot generate COM file : segment-relocatable items present" '
(und ich muß 'interrupt' verwenden, weil ich in meinem anderen Thread noch keinen funktionierenden Hinweis fand, wie man es ersetzt; asm push ax usw reicht nicht),
doch keinen Hinweis wie man den Fehler vermeidet.
Ich glaube ehrlich gesagt nicht wirklich, dass dieser Hinweis eine Berechtigung hat. Durch welchen Mechanismus soll es da denn zu relozierbaren Adressen kommen?
Sag ich doch Siehe den anderen Thread, weder interrupt noch irgendwelche Libraryfunktionen lösen diesen Fehler aus, es ist eine fehlende "Optimierung" oder Typumwandlung des Compilers, die bei COM-Files nötig wäre, siehe http://www.c-plusplus.net/forum/viewtopic-var-p-is-890439.html#890439
Hallo!
Ich hab seit Jahren nicht mehr in C/C++ programmiert und stehe jetzt auf dem Schlauch. Folgendes Programm ist nur so ein Test-Programm, um mich wieder an die ganzen Funktionen und deren Funktionsweise zu erinnern.:
int main(int argc, char* argv[])
{
FILE *vocfile=fopen("vocabulary.txt", "r");
char lines[256][256];
// <Korrektur>
memcpy(lines, 0, 256*256*sizeof(char));
// </Korrektur>
for (int i=0; i<256; i++)
if (fgets(lines[i], 256, vocfile))
printf(lines[i]);
else
break;
getchar();
for (i=0; i<256; i++)
printf(lines[i]);
fclose(vocfile);
return 0;
}
Was das Programm meiner Meinung nach tun sollte:
1. Die Datei "vocabulary.txt" Zeile für Zeile einlesen und in das Array "lines" kopieren, dabei jede Zeile, die gerade eingelesen wurde, auf der Standardausgabe ausgeben.
2. Auf einen Tastendruck warten.
3. Noch mal überprüfen, ob jetzt tatsächlich alles an seinem Platz ist und das Array noch mal Zeile für Zeile ausgeben.
Die erste Ausgabe während des Einlesens, also in der ersten for-Schleife, funktioniert.
Bei der zweiten Ausgabe kommt nur Müll raus (irgendein komisches Zeichen unendlich oft wiederholt).
Also, irgendwie scheinen die eingelesenen Zeilen da nicht so gespeichert zu werden, wie ich mir das vorgestellt hab. Was hab ich falsch gemacht?
Danke schon mal im Voraus!
Krecik
Edit: Hab das Problem erkannt. Siehe Korrektur im Code.
Hi
Ich habe die gleichen Interessen und komme auch nicht weiter
Also die tlb ist eine Type Library/Typenbibliothek. Nun weiß ich nicht genau was das ist, aber es scheint, daß das .tlb-file auch in der DLL integriert ist (Assistenten aus VC++ können aus einer Typenbibliothek importieren und akzeptieren dabei die .dll genauso wie die .tlb)
Naja, die DLL soll ja ein COM-Server sein, daß gibts doch keine Funktionen zu importieren, oder?
Die Klasse COleDispatchDriver gehört irgendwie zu der COM-Unterstützung aus MFC - damit soll es wohl ganz einfach gehen, ich hab da aber auch noch keine Doku zu gefunden.
Ich hoffe mein Text enthält nicht allzu viele Fehlinformationen - ich bin ein Neuling in C++/MFC und versuche gerade mich da ein wenig zu orientieren, also es kann durchaus sein, daß ich da noch was falsch aufgefaßt habe.
Wenn jemand inzwischen neuere Informationen dazu hat, wie man mit oder ohne MFC JabberCOM nutzen kann, dann bitte raus damit
MfG Hirsch
Probier das mal:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
/* ... */
/* Diese Funktion setzt die Cursor-Position auf Spalte x Zeile y (Ursprung: 1 1) */
void gotoxy( int x, int y ) {
HANDLE hCon; /* Konsole-Handle */
CONSOLE_SCREEN_BUFFER_INFO csbi; /* Bildschirmpufferinformationen */
COORD coProspect; /* zu erwartende Cursor-Position */
/* Diese Funktion ermittelt das Standard-Ausgabe-Handle. Dies muss nicht unbedingt eine Konsole sein.
* Der Einfachheit halber soll es aber erstmal genuegen, da Konsole-API-Funktionen auf Nicht-Konsole Handles eh fehlschlagen.
*/
hCon = GetStdHandle( STD_OUTPUT_HANDLE );
/* Jetzt Informationen ueber den Bildschirmpuffer der Konsole einholen. */
if ( !GetConsoleScreenBufferInfo( hCon, &csbi ) ) return; /* Rueckkehr ohne Aktion bei Fehlern */
/* Zunaechst die gewuenschte bzw. erwartete Cursorposition berechnen. */
coProspect.X = (SHORT)( x - 1 ); /* -1 wegen 0-Urpsrung bei Konsole-API */
coProspect.Y = (SHORT)( y - 1 );
/* Pruefen, ob Cursorposition jenseits der Grenzen des Konsole-Puffers. In dem Fall Clipping durchfuehren. */
if ( coProspect.X < (SHORT) 0 ) coProspect.X = (SHORT) 0;
else if ( coProspect.X >= csbi.dwSize.X ) coProspect.X = csbi.dwSize.X - (SHORT) 1;
if ( coProspect.Y < (SHORT) 0 ) coProspect.Y = (SHORT) 0;
else if ( coProspect.Y >= csbi.dwSize.Y ) coProspect.Y = csbi.dwSize.Y - (SHORT) 1;
/* Pruefen, ob Cursorposition bereits stimmt. In dem Fall, nichts unternehmen */
if ( csbi.dwCursorPosition.X == coProspect.X && csbi.dwCursorPosition.Y == coProspect.Y ) return;
/* Andernfalls, Cursorposition setzen. */
SetConsoleCursorPosition( hCon, coProspect );
}
/* das war's auch schon ... jetzt ein Testprogramm */
int main( int argc, char** argv ) {
gotoxy( 5, 5 );
printf( "hello world!\n" );
return EXIT_SUCCESS;
}
Beim Verlassen des Programms steht der Cursor uebrigens dort, wo er zuletzt hingesetzt wurde. Will man das nicht haben, muss man den Console-Puffer zu Beginn sichern und am Ende wiederherstellen.
Also wenn du die Grundlagen beherrscht, kannst du weitermachen wo du willst, du musst dir nur Turorials oder Bücher zu dem Thema besorgen( Googeln hilft ).
Hier ein paar Links von mir:
http://www.winapi.net/
http://www.robsite.de/tutorials.php?tut=windows
http://www.win-api.de/index.php
Na ja ok ich weiss ich sollte mich mal registrieren, aber dass ist ganz sicher KEIN!!! Dialer, ich weiss nich mal wie man son teil proggt...
Und die Auswahlmöglichkeiten "C" und "A", stehen für eigene Verschlüsselungsmethgoden, werden komplizierter verschlüsselt als dezimal oder hexadezimal.
Trotzdem thx dass ihr bis jetzt so "fleissig" wart
Hat man erstmal das Fensterhandle, kann man ueber SetClassLongPtr() z.B. die Fensterprozedur subclassen. Das geht mit der Konsole genauso wie mit jedem anderen Programm (falls es bei XP noch geht wg. Sicherheitsbechraenkungen). D.h. man schreibt eine eigene Fensterprozedur und behandelt z.B. die WM_PAINT-Message zuerst selber, bevor man den Code der Konsole aufruft (oder umgekehrt). Naeheres zum Subclassen findet sich z.B. in der Windows Platform SDK Dokumentation ( http://msdn.microsoft.com/library/ ).