Toon posts:

[C] global variabele aanmaken

Pagina: 1
Acties:
  • 255 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
In het simulatieprogramma Automod (maar dat kent niemand hier natuurlijk...) programmeer je in principe met de bijbehorende taal, maar lastige dingen kun je ook in C programmeren.

Ik wil nu een string laten aanmaken (combineren van drie andere strings). Dit kan niet met de Automod taal, maar wel met C (toch??). Ik heb echter niet zoveel verstand van C. Dit heb ik nu:
code:
1
2
3
4
5
6
7
#include "user.h"
functiec (V_test1)
char* V_test1;

{
global V_test1="arc/661011200.txt";
}

Nu krijg ik echter een "parse error". ZOnder dat global erbij gaat het wel goed, maar kan ik de variable V_test1 niet op andere plekken in het programma gebruiken, daarvoor moet hij "global" zijn.

Hoe krijg ik dit voor elkaar?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Ga eens gewoon C leren! Het is geen PHP. Pffff.

Hint: in C zijn alle globale variabelen in locale scope te bereiken. Apart declareren is dus niet nodig.
Op maandag 08 april 2002 15:12 schreef zware_jongen het volgende:
ZOnder dat global erbij gaat het wel goed, maar kan ik de variable V_test1 niet op andere plekken in het programma gebruiken, daarvoor moet hij "global" zijn.
Ik weet niet hoe je daarbij komt, maar dat klopt dus niet. Als je hem globaal gedeclareert hebt, zoals je in dat geval doet, kun je hem juist WEL in de globale scope gebruiken.

Los hiervan heb ik 't vermoeden dat je geen idee hebt wat een string in C is. Dat kan nog voor aardige problemen zorgen.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 19:57
Jij bent bezig met een heel oude notatie van C. De manier waarop jij het doet wordt een parameter gedeclareerd in K&R C.

Een globale variabele is een variabele die buiten alle functies wordt gedeclareerd.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:34
gebruik eens strcpy voor de assignment.

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09-09 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 08 april 2002 15:40 schreef whoami het volgende:
gebruik eens strcpy voor de assignment.
V_test1 is een char *, dus een assignment gaat prima zo

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Verbal Kint
  • Registratie: Januari 2001
  • Laatst online: 27-05-2025

Verbal Kint

The man with the plan

Misschien kan ik nog het een en ander verduidelijken; zware jongen (en ik trouwens ook) heeft nog nooit ook maar een letter in C geprogrammeerd. Helaas kan het nu niet anders, omdat de taal die we gebruiken niet datgene bied dat we nodig hebben.

Gelukkig kan je in de code van dat programma (AutoMOD dus) een subroutine aanroepen die in C geschreven is, zodat je om de beperkte mogelijkheden van het programma zelf heen kunt werken.

Om een variable die je in de C subroutine creeert in de code van het programma zelf te kunnen gebruiken moet deze "global" zijn. Dit is wat de handleiding er over zegt, wij hebben niet echt een idee wat dat betekend, want wij hebben dus geen enkele ervaring met C. Met behulp van een voorbeeld uit dezelfde handleiding hebben we het bovenstaande stukje code in alkaar geknutseld, maar dat blijkt niet te werken.

Lokaal werkt de variabele dus wel (haal dat "global" weg), maar daar hebben we niets aan.

Heeft iemand nog tips, eventueel verduidelijkt met wat code?

Great minds think alike!


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Je wil dus een C programma schrijven. Het lijkt me duidelijk dat je daarvoor in C moet kunnen programmeren. Als je naar eigen zeggen nog nooit ook maar een letter in C geprogrammeerd en dus geen enkele ervaring met C hebt, is het misschien verstandig om eerst te leren in C te programmeren.

Ik ga zeker geen werkend programma voorkauwen (en ik hoop dat niemand anders dat doet), maar de door jou geschreven code is op de volgende manier werkend te krijgen:
code:
1
2
3
4
5
6
7
8
#include "user.h"

char* V_test1;

void functiec()
{
  V_test1="arc/661011200.txt";
}

Waarschijnlijk is dit niet helemaal wat je wilt; dat kan ik echter zo niet beoordelen. Zoals ik eerder al opmerkte zul je toch echt enige kennis van C en de daarin gebruikte datastructuren moeten hebben om een fatsoenlijk programma te schrijven.

  • igmar
  • Registratie: April 2000
  • Laatst online: 09-09 19:53

igmar

ISO20022

code:
1
2
3
4
5
6
7
#include "user.h"
functiec (V_test1)
char* V_test1;

{
global V_test1="arc/661011200.txt";
}
a) de variabele V_test1 buiten de functie zetten. Alle zaken die niet in een functie staan zijn globaal en in alle functies te bereiken.

b) char * blaat = "stringetje" is een CONSTANT, en die kun je dus NIET veranderen. Niet echt wat je wilt denk ik.

char blaat[256];
strcpy(blaat", "stringetje");

eea kan ook in een regel, maar dit terzijde.

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
b) char * blaat = "stringetje" is een CONSTANT, en die kun je dus NIET veranderen. Niet echt wat je wilt denk ik.
Daar heb je gelijk in, maar kijk hier eens na:
code:
1
char blaat[] = "stringetje";

De compilers die ik ken maken hier wel een wijzigbare string van (komt gewoon op de stack te staan). Ik weet alleen niet of dat ook per standaard zo is, of dat het een extensie van de door mij gebruikte compilers is (achter de schermen zal dat dan wel een soort: char blaat[X]; strcpy(blaat, S); zijn).

Of bedoelde je dat ook met:
eea kan ook in een regel, maar dit terzijde.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Op maandag 08 april 2002 23:39 schreef Infinitive het volgende:
De compilers die ik ken maken hier wel een wijzigbare string van (komt gewoon op de stack te staan). Ik weet alleen niet of dat ook per standaard zo is, of dat het een extensie van de door mij gebruikte compilers is (achter de schermen zal dat dan wel een soort: char blaat[X]; strcpy(blaat, S); zijn).
Het schrijven in constanten behoort tot wat in GNU-terminologie 'traditional behaviour' heet en wordt door sommige oude compilers ondersteund. Het is echter niet netjes. Dit is echter niet waar jij het over hebt. Je mist het (subtiele) verschil tussen initialisatie van waarden en het definieren van constante waardes.

In deze code:
code:
1
  int i=5;

Is '5' een constante waarde. Je kan die '5' niet wijzigen. 'i' is echter een variabele, die je dus wel kan wijzigen, die toevallig met de constante waarde '5' geinitialiseerd wordt.

Als je de volgende code hebt:
code:
1
  char *str="blaat";

Is "blaat" weer een constante waarde (bestaande uit zes opeenvolgende bytes). 'str' wordt geinitialiseerd met het adres van die constante. Wederom kan je 'str' wel wijzigen, aangezien 'str' gewoon een variabele is (met daarin een geheugenadres), maar aangezien het geheugenadres verwijst naar geheugen waarin niet geschreven kan worden, kan je de constante 'blaat' niet wijzigen. Het verschil tussen '++str' (wel toegestaan) en '*str=0' moge duidelijk zijn.

Als je tenslotte jou code hebt:
code:
1
  char str[]="blaat";

Is 'str' weer een variabele, maar nu een die wordt geinitialsieerd maar met de bytewaarden van de constante "blaat" (in plaats van met het adres van deze constante). Deze situatie is dus te vergelijken met de eerstgenoemde ('int i=5'), met het verschil dat str nu een wat groter datatype is. Omdat verder niet aan "blaat" wordt gerefereerd, is het zinloos om deze constante verder nog ergens op te slaan (zoals ook het geval was bij '5') en zal deze dus uitsluitend op de stack komen te staan.

  • Verbal Kint
  • Registratie: Januari 2001
  • Laatst online: 27-05-2025

Verbal Kint

The man with the plan

Op maandag 08 april 2002 21:48 schreef Soultaker het volgende:
Je wil dus een C programma schrijven. Het lijkt me duidelijk dat je daarvoor in C moet kunnen programmeren. Als je naar eigen zeggen nog nooit ook maar een letter in C geprogrammeerd en dus geen enkele ervaring met C hebt, is het misschien verstandig om eerst te leren in C te programmeren.
Programmeren in Simple kan ik, evenals in de diverse basic-varianten van oude homecomputers. Programmeren in C kan ik dus niet, so shoot me..

Ik wil dat graag leren, maar op dit moment is alles wat ik wil het combineren van twee strings tot een nieuwe. C is het enige dat ik daarvoor kan gebruiken.

Overigens hebben we ook al een work-around bedacht voor dit probleem, maar dat is niet zo'n mooie oplossing. En dat is uiteindelijk toch waar programmeren op om draait niet waar?

Het verzinnen van mooie oplossingen (lastig!, leuk!) en vervolgens deze prachtige oplossingen ff in je compu stoppen (zo gedaan, als je de taal beheerst tenminste...)

Great minds think alike!


  • Belgar
  • Registratie: Januari 2002
  • Laatst online: 17-08 22:31

Belgar

Archmaster ranzige code..

includen van strings.h, geloof ik. Dan even searchen op STRCAT

...Als het maar werkt


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Op dinsdag 09 april 2002 03:12 schreef 456GT het volgende:
Programmeren in Simple kan ik, evenals in de diverse basic-varianten van oude homecomputers. Programmeren in C kan ik dus niet, so shoot me..
Nu doe je alsof ik het je kwalijk neem dat je niet kan programmeren in C. Dat is natuurlijk niet zo! Wat ik je wel kwalijk neem, is dat je een programma wilt schrijven in C, maar niet bereid bent daartoe C te leren.
Ik wil dat graag leren, maar op dit moment is alles wat ik wil het combineren van twee strings tot een nieuwe. C is het enige dat ik daarvoor kan gebruiken.
Dat hangt er dus helemaal vanaf hoe je strings gerepresenteert worden (zoals ik al eerder heb gezegd). Zolans je daar geheimzinnig over blijft doen kan ik je ook niet echt helpen, behalve je op het bestaan van strcat (man strcat) te wijzen.
Overigens hebben we ook al een work-around bedacht voor dit probleem, maar dat is niet zo'n mooie oplossing. En dat is uiteindelijk toch waar programmeren op om draait niet waar?
Het verzinnen van mooie oplossingen (lastig!, leuk!) en vervolgens deze prachtige oplossingen ff in je compu stoppen (zo gedaan, als je de taal beheerst tenminste...)
Agreed. :)

  • Verbal Kint
  • Registratie: Januari 2001
  • Laatst online: 27-05-2025

Verbal Kint

The man with the plan

Op dinsdag 09 april 2002 12:03 schreef Soultaker het volgende:
Nu doe je alsof ik het je kwalijk neem dat je niet kan programmeren in C. Dat is natuurlijk niet zo! Wat ik je wel kwalijk neem, is dat je een programma wilt schrijven in C, maar niet bereid bent daartoe C te leren.
Ik wil best C leren, maar op dit moment heb ik andere prioriteiten (zoals het ontwikkelen van een simulatiemodel), daarvoor moet ik een, waarschijnlijk eenvoudige, subroutine in C hebben en met behulp van google en de handleiding was ik al een beetje op weg, maar helaas nog niet op mijn bestemming.
Dat hangt er dus helemaal vanaf hoe je strings gerepresenteert worden (zoals ik al eerder heb gezegd). Zolans je daar geheimzinnig over blijft doen kan ik je ook niet echt helpen, behalve je op het bestaan van strcat (man strcat) te wijzen.
Er zijn twee variabelen: V_1, een datum en V_2, een vrachtnummer. Deze twee variabelen samen geven de naam van een tabel in plain text, en die moet dan worden uitgelezen. Dat gebeurt dus per vracht/dag, omdat het model anders veel te langzaam wordt. De string die moet worden samengesteld wordt dus: V_new: ""V_1""V_2".txt". Vervolgens laten we AutoMOD de file inlezen waar V_new naar wijst.

Great minds think alike!


Verwijderd

Topicstarter
Op dinsdag 09 april 2002 12:03 schreef Soultaker het volgende:

[..]

Nu doe je alsof ik het je kwalijk neem dat je niet kan programmeren in C. Dat is natuurlijk niet zo! Wat ik je wel kwalijk neem, is dat je een programma wilt schrijven in C, maar niet bereid bent daartoe C te leren.
[..]
FF 456GT helpen ;) Het programma automod is gebaseerd op de taal C. Echter dit is slechts op het allerlaagste niveau in het programma terug te vinden en dat is voor dit onderzoek (studiedoeleinden) niet relevant. Het programma automod gebruikt (werkelijk waar) een taal als in het volgende voorbeeld:
code:
1
2
3
4
5
6
7
8
9
begin P_enter arriving procedure
    move into agv:cp1
    send to P_out
end

begin P_out arriving procedure
    move into agv:cp2
    send to die
end

Zoals je ziet is dit nauwelijks programmeren te noemen, maar dat ligt aan het programma zelf. Het probleem is echter dat de mogelijkheden met deze taal beperkt zijn. Daarom wordt de mogelijkheid geboden bepaalde stukken te programmeren in C. Het enige wat we willen is een kleine operatie uitvoeren in C, daarom is het dus totaal overbodig om eerst C helemaal te gaan leren (BTW de deadline voor het project ligt over 1,5 week (is geen ranzigheid van onze kant) en we hebben daar dus simpelweg geen tijd voor.

Het probleem is het volgende. We moeten in automod file'tjes (plain text files) inlezen. Dat is geen probleem, wat wel een probleem is, is dat we er een paar duizend hebben. We willen de naam van deze files dus graag automatisch laten samenstellen (het oproepen van de files wel te verstaan). De naam van de files bestaat uit een vluchtnummer van een vliegtuig en een datum waarop het aankwam. Een mogelijkheid is dus 661010100.txt. Dit gaat dan om vlucht 661 op 01-01-2000. Wat we willen in C is dat er wordt gekeken naar twee attributen (die we meesturen) en achter elkaar zet en daar vervolgens ".txt" achter zet. Daarna moet het terug het model in. We sturen dus een vluchtnummer en een datum naar binnen en we willen daar uitkrijgen "vluchtnummer""datum".txt

Ik hoop dat het probleem nu duidelijker is en dat er geen misverstand over bestaat dat we absoluut bereid zijn er moeite en tijd in te steken, maar dat we op dit moment simpelweg geen tijd hebben om ons alle fijne kneepjes van C toe te eigenen. In ieder geval alvast bedankt voor de reacties.

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
zoals hierboven staat .. kijk eens naar strcat
succes!
Pagina: 1