WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Simulationen > Designer Forum

Designer Forum Treffpunkt für Gedankenaustausch von Simmern, die selbst

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 05.07.2003, 13:44   #11
bartels
Jr. Member
 
Registriert seit: 01.10.2002
Alter: 57
Beiträge: 90


Standard

Also "%d" funktioniert nur bei Integer Zahlen, nicht bei floats, die als integer dargestellt werden sollen.
Eine Möglichkeit ist, vorher auf einen anderen Variablentyp umwandeln ("casten") wie Du auch schon gmacht hast, (FLOAT64)val wandelt val (vom Typ FLOAT64) in einen FLOAT64-Wert um, also überflüssig hier.
Im Gegensatz dazu wandelt (SINT32) oder (int) eine Zahl in eine Integerzahl um und rundet ab, z.B.:
sprintf(pelement->string, "%d", (SINT32)val);
Alternativ kannst Du auch ein anderes Format verwenden, z.B.:
sprintf(pelement->string, "%.0f", val);
Hier wird eine Floatzahl ("%f") ohne Nachkommastelle (".0") in pelement->string geprinted, dabei wird gerundet. Die Formatstrings sind übrigens in C und XML sehr ähnlich !d! (XML) entspricht "%d" (C).
Die val!=val bringt wie Du schon bemerkt hast, gar nichts. Ich weiß auch nicht wie das sich mal in die "üblichen" String-Callbacks geschlichen hat.

Wie geasgt ist value/=bla eine Abkürzung für val=val/bla. Wie suich das mit einer doppelten Zuweisung in einer Zeile verhält habe ich nicht so im Kopf. So etwas vermeide ich immer, es geht ja auch in zwei Schritten. Ich gehe ziemlich stark davon aus, dass von rechts nach links abgearbeitet wird, aber sicher bin ich mir da nicht.
Arne Bartels
bartels ist offline   Mit Zitat antworten
Alt 05.07.2003, 16:04   #12
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Reden Hallo!

Mensch, bin ich blöd...
Ich hatte ja sicher ein paar Stunden herumgetan, bevor ich ins FXP gepostet habe. Dabei hatte ich auch schon eine deiner Rechnungen in der .c stehen gehabt. Und trotzdem hatts nicht funktioniert! Und weißt warum? Weil die Batch Datei das Gauge nicht ins Gauge Verzeichnis kopiert hat!!! Aber wie so oft hat da nicht das Programm, sondern der Benutzer schuld

Trotzdem Danke für die Antworten, waren ja immerhin doch wieder mal ein paar Neuigkeiten für mich dabei!

Achja, was könnte der Grund dafür sein, dass meine Batch Datei nicht funktioniert hat?
del *.obj
del *.lib
del *.exp
del *.res
move *.gau C:\Programme\Microsoft Games\Fs2002\GAUGES




Viele Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Alt 05.07.2003, 16:43   #13
bartels
Jr. Member
 
Registriert seit: 01.10.2002
Alter: 57
Beiträge: 90


Standard

Vielleicht

move *.gau "C:\Programme\Microsoft Games\Fs2002\GAUGES"

?
Wenn Du MS VC++ besitzt kann man auch direkt mit der IDE kompilieren, und nicht per makefile und Kommandozeile. Das Thema ist hier im Forum schon mal (oder öfter) durchgekaut worden.
Arne Bartels
bartels ist offline   Mit Zitat antworten
Alt 05.07.2003, 17:02   #14
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Standard

Doch, doch, ich mache meine Gauges schon mit MS VS C++, ist ja immerhin sehr übersichtlich!

Aber im Release Ordner habe ich mir eine .bat erstellt, um nicht jedesmal die .gau ins Gauges Verzeichnis kopieren zu müssen.


Viele Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Alt 05.07.2003, 17:12   #15
bartels
Jr. Member
 
Registriert seit: 01.10.2002
Alter: 57
Beiträge: 90


Standard

Man kann nämlich gleich in das entsprechende Verzeichnis kompilieren, antstatt "Release\gaugename.gau" den vollständigen Pfad angeben.
Arne Bartels
bartels ist offline   Mit Zitat antworten
Alt 06.07.2003, 01:15   #16
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Frage Hallo!

Der String, der die VS darstellt, ändert mit Überschreiten eines bestimmten VS-wertes die Farbe.(oder bessergesagt: Es wird ein anderer String verwendet, der eine andere Farbe besitzt!).

Dieser Grenzwert soll von außen her eingestellt werden können. Ich hab die beiden Werte farbe_max und farbe_min genannt. Wenn ich sie oben mit #define eingefügt habe, hat alles funktioniert. Das funktioniert alles perfekt.
Aber der I/O funktioniert nicht Dabei hatte er in Turbo C++ immer so gut funktioniert.

Später soll es dann so laufen, dass gecheckt wird, ob die Datei vorhanden ist und ob sie mit Inhalt gefüllt ist.(mit if(!file), wenns denn funktioniert. gibts dann außerdem noch eine Möglichkeit herauszufinden, ob die Datei leer ist? Vielleicht mit if(wert="")).
Wenn die Datei leer ist, dann sollte sie mit dem Standardwert 3000 gefüllt werden.
Wenn sie bereits gefüllt ist, dann wird der Wert herausgelesen und für die beiden Werte verwendet: Einmal positiv, das andere Mal negativ.

mfg
harri


#include <stdio.h>
#define datei "gauge.txt"

FILE *pfile;
char wert[4];

pfile=fopen("datei", "r");

fscanf("pfile","%s",wert);
farbe_max=wert;
farbe_min= - wert;

fclose(pfile);

//------------------------------------------------------

C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(36) : error C2040: 'pfile' : 'int ' differs in levels of indirection from 'struct _iobuf *'
C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(36) : error C2099: initializer is not a constant
C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(38) : error C2143: syntax error : missing ')' before 'string'
C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(38) : error C2143: syntax error : missing '{' before 'string'
C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(38) : error C2059: syntax error : ''
C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(38) : error C2059: syntax error : ')'
C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(39) : warning C4047: 'initializing' : 'int ' differs in levels of indirection from 'char *'
C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(40) : error C2171: '-' : illegal on operands of type 'char [4]'
C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(40) : error C2099: initializer is not a constant
C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(43) : warning C4273: 'fclose' : inconsistent dll linkage. dllexport assumed.
harry3 ist offline   Mit Zitat antworten
Alt 06.07.2003, 09:51   #17
bartels
Jr. Member
 
Registriert seit: 01.10.2002
Alter: 57
Beiträge: 90


Standard

Du kriegst den Hals wohl auch nicht voll.
Das soll in Turbo C++ funktioniert haben? Da glaube ich nicht ganz dran, mit char[] und dann == geht nicht viel, besser die strcmp(),strlen() Funktionen verwenden. Das heißt in C++ können natürlich die (hinterhältigen) automatischen Konversionen auftauchen mit den versteckten Operatorübelagerungen die == und dergleichen auf char erlauben, aber da muss man dann CString nehmen, oder so.

Zum Thema Farbe des Strings:
Mit
Code:
...
if(...<...)
  pelement->fg_color=RGB(x,x,x);
else
  pelement->fg_color=RGB(y,y,y);
...
kannst Du die Farbe direkt im String callback manipulieren. U.U lohnt es sich zum Rückgabewert der callback-Funktion noch den Farbwert zu addieren,falls die Farbe "stecken bleibt". Dann ist auf jedem Fall mit einer Farbänderung auch die Funktionsückgabe geändertund der String wird neugezeichnet.z.B.
Code:
return ... + pelement->fg_color
Wenn es "nur" um einen Parameter geht, kannst Du den "fünften Parameter" in der panel.cfg benutzen (siehe auch Concorde panel.cfg die Zahl hinter X,Y,Breite,Höhe). Diese ist das "parameters" Mitglied der GAUGEHDR-Struktur. Du könntest es einmal von der gauge callback Funktion in eine Variable lesen,z.B.:
Code:
...
//global deklarieren und schon mal vorbesetzen
SINT32 maxvspd=3000;
....
//das hier im gauge callback
case	PANEL_SERVICE_POST_INSTALL:
  if(pgauge==NULL)
    break;
  if(pgauge->parameters==NULL)
    break;
  if(strlen(pgauge->parameters)==0)
    break;
  maxvspd=atoi(pgauge->parameters);
  break;
....
Oder permanent bei jedem Refresh im String Callback:
Code:
//lokal deklarieren und schon mal vorbesetzen
SINT32 maxvspd=3000;
...
if(pelement)
  if(pelement->gauge_header)
   if(pelement->gauge_header->parameters)
     if(strlen(pelement->gauge_header->parameters)>0)
      maxvspd=atoi(pelement->gauge_header->parameters);
Wenn Du mit ini-ähnlichen Dateien rumhampeln willst (bei mehr als einem Parameter) bieten sich u.U. die Funktionen um Get/SetPrivateProfile...() an. Das sind die Systemfuntionen zum Zugriff auf ini,cfg Dateien und Ähnlichem. Zur Beachtung: die brauchen den vollständigen Pfad, sonst ist alles relativ zum Windows Verzeichnis. GetModuleFileName(NULL,string,stringlen); gibt z.B. den Pfad zur FS exe, mit ein bisschen Geschnippel bekommt man den gauges Pfad daraus.

Als letztes kann man natürlich nochmal auf deinen Code eingehen:
Probier mal:
Code:
#include 
#define datei "gauge.txt"

FILE *pfile;
char wert[4];

pfile=fopen(datei, "r");

//existiert Datei?
if(pfile)
{
 fscanf(pfile,"%s",wert);
 //steht was drin?
 if(strlen(wert))
 {
  farbe_max=atoi(wert);
  farbe_min= - atoi(wert);
 }

 fclose(pfile);
}
Ich persönlich bevorzuge fgets(wert,sizeof(wert),pfile) anstelle von fscanf(pfile,"%s",wert), aber das ist Ansichtssache. Übrigens passen in char[4] nur dreistellige Zahlen, es empfiehlt sich ein bischen mehr an Speicher zu genehmigen (es sollte genug da sein). BTW fgets ist auch sicherer gegenüber Buffer Overflows.
Arne Bartels
bartels ist offline   Mit Zitat antworten
Alt 06.07.2003, 10:55   #18
bartels
Jr. Member
 
Registriert seit: 01.10.2002
Alter: 57
Beiträge: 90


Standard

Wieso ist eignetlich schon wieder das #include <stdio.h> verdunstet? Grr.
Arne Bartels
bartels ist offline   Mit Zitat antworten
Alt 06.07.2003, 13:03   #19
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Böse Hallo!

Erst mal Danke für deine Antwort!

Zitat:
Du kriegst den Hals wohl auch nicht voll.
Naja, es kommt nicht oft vor, dass ich ein Wochenende lang Zeit habe, mich vor den Computer zu sitzen. Aber da die Schule gerade aus war, die Ferialarbeit noch nicht angefangen hat und ich mal nichts am Wochenende vorhatte, dachte ich mir, dass ich mal so viel wie nur irgendwie möglich weiterbringe in C.

Der letzten Code, denn du gepostet hattest, funktioniert leider genauso wenig wie mein Code

error C2040: 'pfile' : 'int ' differs in levels of indirection from 'struct _iobuf *'

Ich habe echt eine Ahnung wie das zu bewerkstelligen ist. Denn das bisschen C, was wir bis jetzt gelernt haben, haben wir in Turbo C++ geschrieben, und da hats auch immer geklappt.

Zitat:
Das soll in Turbo C++ funktioniert haben?
Ja, habs noch mal ausprobiert. Es funktionietrt, es wurde eine Datei erstellt und hallo hineingeschrieben.


Viele Grüße,
Harri


P.S.: Nach dem ich den File I/O geschafft habe, ist endgültig Schluß mit dem Gauge. Dann hab ich meinen Hals (vorerst) voll
harry3 ist offline   Mit Zitat antworten
Alt 06.07.2003, 15:25   #20
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Frage Hallo!

Ich habe mir zum Abschluss noch eine .exe im Turbo C++ gemacht, die die .txt Datei im Gauges Verzeichnis bearbeiten soll. Das Programm funktioniert sehr gut, wenn man die .txt Datei in C:\ erstellt. Wenn man allerdings einen darunterliegenden Ordner, wie z.B. "C:\\Programme\\Microsoft Games\\FS2002\\Gauges\vsi.txt" angibt, so funktioniert es leider nicht. Es wird weder eine .txt erstellt noch verändert!

Vielleicht fällt dir ja noch was ein zum File IO, vielleicht bekomm ich das Gauge ja dann heute noch fertig.


Viele Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist an.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:01 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag