C-Skript Variablennamen in einer FOR-Schleife "Hochzähl

Jochen

Level-1
Beiträge
131
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo. Ich sitze schon den ganzen Vormittag vor WinCC 6.0 und verusche, ne Lösung zu finden.
Also ich habe einen Polygonzug (20 Punkte) dessen einzelne Punkte über Variablen definiert werden. Ich habe 20 X-Positionsvariablen (X_1 bis X_20) angelegt und 20 Y-Variablen. Nach einem Klick auf einen Button läuft folgendes Script ab:

Code:
SetIndex(lpszPictureName, "Polygonzug18", 1);
SetActualPointLeft(lpszPictureName, "Polygonzug18", GetTagFloat("X_1");
SetActualPointTop(lpszPictureName, "Polygonzug18", GetTagFloat("Y_1");

SetIndex(lpszPictureName, "Polygonzug18", 2);
SetActualPointLeft(lpszPictureName, "Polygonzug18", GetTagFloat("X_2");
SetActualPointTop(lpszPictureName, "Polygonzug18", GetTagFloat("Y_2");

[...] usw. [...]

SetIndex(lpszPictureName, "Polygonzug18", 20);
SetActualPointLeft(lpszPictureName, "Polygonzug18", GetTagFloat("X_20");
SetActualPointTop(lpszPictureName, "Polygonzug18", GetTagFloat("Y_20");

Nun probiere ich den ganzen Tag schon, statt 20 Einzelanweisungen das ganze mit einer For-Schleife zu realisieren, aber ich steh bei den Variablennamen auf dem Schlauch. Wie kann ich die "X_" und "Y_" mit einem i verknüpfen?
Habe schon die Funktion strcat ausprobiert aber ich weiss auch nicht so recht, wie das alles funktionieren kann. Hat jemand ne Lösung für mich?

Grüße

Jochen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Re: C-Skript Variablennamen in einer FOR-Schleife "Hoch

Jochen schrieb:
Code:
SetIndex(lpszPictureName, "Polygonzug18", 2);
SetActualPointLeft(lpszPictureName, "Polygonzug18", GetTagFloat("X_2");
SetActualPointTop(lpszPictureName, "Polygonzug18", GetTagFloat("Y_2");
Ich kenne WinnCC nicht, aber in C an sich ist es generell völlig unmöglich, über einen zur Laufzeit gebildeten Variablennamen auf eine Variable zuzugreifen, da die Variablennamen dem Laufzeitsystem unbekannt sind. Der Compiler setzt sie beim Compilieren in numerische Adressen um.
In WinCC könnte das nur dann anders sein, wenn der C-Code interpretiert würde.
Die "normale" Lösung in C ist, daß du deine Variablen in ein Array packst.
Da du auch mehrere Polygonzüge zu haben scheinst, kannst du deren Namen mit sprintf bilden:
Code:
char polyName[40];
sprintf(polyName,"Polygonzug%d",k);
for i=0;i<20;i++)[
 SetIndex(lpszPictureName, polyName, 20);
 SetActualPointLeft(lpszPictureName, polyName, GetTagFloat("X_[i]");
 SetActualPointTop(lpszPictureName, polyName, GetTagFloat("Y_[i]");
}

Solltest du aus irgendeinem Grund wirklich keine Arrays verwenden können, geht eine switch-Anweisung:
Code:
switch(i) {
case 0:
 localx=X_0;
 localy=Y_0;
break
...
case 2:
 localx="X_2";
 localy="Y_2";
break
....
case 20:
 localx="X_20";
 localy="Y_20";
break
} // switch ends
 SetIndex(lpszPictureName, "Polygonzug18", i);
 SetActualPointLeft(lpszPictureName, "Polygonzug18", GetTagFloat(localx);
 SetActualPointTop(lpszPictureName, "Polygonzug18", GetTagFloat(localy);
Das bringt aber nur was, wenn der gemeinsame Code länger ist als all die case-Anweisungen.
 
Hallo Jochen,
in WinCC geht das so :
Code:
{
char* VarName;
int i;

VarName = SysMalloc(10);    // länger als Variablenname + #0 für Stringende
for i=0;i<20;i++)
 {
 SetIndex(lpszPictureName, "Polygonzug18", i);
 sprintf(VarName,"X_"%d, i);
 SetActualPointLeft(lpszPictureName, "Polygonzug18", GetTagFloat(VarName);
 sprintf(VarName,"Y_"%d, i);
 SetActualPointTop(lpszPictureName, "Polygonzug18", GetTagFloat(VarName);
 }
SysFree(VarName);
}

Dies ist ein Beispiel für "Polygonzug18" , mit 20 Eckpunkten. Das kann man noch optimieren, wegen der Übersichtlichkeit habe ich darauf verzichtet. Und dann kann man noch, wie von Zottel schon vorgeschlagen, auch die Polygonzüge in einer Schleife bearbeiten.

Gruß
Question_mark
 
Hallo.

Erstmal danke für die schnellen Antworten. Es scheint Tatsächlich so zu gehn. Perfekt, danke euch. Falls doch noch was fehlt, dann meld ich mich.
Gruß

Jochen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Re: C-Skript Variablennamen in einer FOR-Schleife "Hoch

Wozu VarName mit malloc dynamisch anlegen? Warum nicht einfach:
Code:
{
char VarName[10];    // länger als Variablenname + #0 für Stringende
int i;

for i=0;i<20;i++)
 {
 SetIndex(lpszPictureName, "Polygonzug18", i);
 sprintf(VarName,"X_"%d, i);
 SetActualPointLeft(lpszPictureName, "Polygonzug18", GetTagFloat(VarName);
 sprintf(VarName,"Y_"%d, i);
 SetActualPointTop(lpszPictureName, "Polygonzug18", GetTagFloat(VarName);
 }
// SysFree(VarName); //entfällt
}
 
Hallo,
Zottel schrieb:
Wozu VarName mit malloc dynamisch anlegen
Ist in diesem Beispiel natürlich nicht zwingend notwendig. Wird "VarName" aber in WinCC z.B. als Funktionsergebnis zurückgegeben und weiter verwendet, so knirscht es ganz mächtig im WinCC-Gebälk, wenn vorher kein Speicher mit malloc alloziert wurde.

Gruß
Question_mark
 
Zurück
Oben