Sida 3 av 10
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 2 maj 2014, 22:32:33
av Al_Bundy
Jag tränar via praktiskt, men jag har faktiskt kollat mycket på tuben och läst halva boken "Vägen till C". Sen tröttnade jag.
Jag är en sådan person som måste praktiskt tillämpa uppgifter för att lära mig teorin. Annars går det inte.
Minns en gång när jag skulle läsa en bok. Efter jag hade läst klart boken(ungefär hela, har aldrig läst ut en bok helt någonsin) så glömde jag bort vad boken handlade om.
Men då vet jag att efter return så är funktionen avslutad. Tackar!

Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 2 maj 2014, 23:10:30
av TomasL
Lämpligt att du slutar med de sakerna då, och gör det du orkar lära dig istället, dvs uppenbarligen ingenting
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 2 maj 2014, 23:18:34
av johano
Al_Bundy skrev:johano: Brukar void returnera ett värde? Trodde void gjorde inte det.
Den returnerar inte void, den returnerar void*, dvs en datatyp som kan representera vilken annan pekare som helst.
/johan
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 2 maj 2014, 23:49:13
av Al_Bundy
TomasL skrev:Lämpligt att du slutar med de sakerna då, och gör det du orkar lära dig istället, dvs uppenbarligen ingenting
Jag kan säga redan nu är att jag har redan skrivit en tredjedel av koden RÄTT nu.
Jag tycker du verkar bara se ett inlärningssätt. Finns flera olika sätt att lära sig. En del föredrar att dra igenom matteboken rakt av, vissa föredrar att inte alls läsa matteboken och ge sig på uppgifterna direkt.
Själv tar jag ingenjörsexamen i maskinteknik nästa år.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 3 maj 2014, 00:15:17
av TomasL
Själv tar jag ingenjörsexamen i maskinteknik nästa å
Tveksam till det, med den inställningen du hittills visat.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 3 maj 2014, 09:40:40
av svanted
sodjan skrev:> ...annars hoppar jag till funk1()
Nej, nej, nej, nej...
Du *hoppar*
aldrig till en funktion, de
anropas !!
jag trodde det...
en funktion ligger väl på ett annat ställe i koden?
om programräknaren, istf att räkna instruktioner en efter en går till ett värde som ligger 4324 steg uppåt eller neråt i koden
kan det väl kallas att räknaren hoppar till?
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 3 maj 2014, 09:50:12
av ajje
Ja, processorn "hoppar" till ett annat ställe i koden, men du som programmerare ska inte tänka så.
Betraktar du det som ett hopp (goto) så faller hela iden med strukturerad programmering och det brukar på minnessnåla system betyda att du kör slut på stacken förr eller senare.
Det är en funktion som anropas, och det är funktionen som ska avsluta och returnera ett värde.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 3 maj 2014, 09:58:38
av svanted
okejj...vaknade nu...
med ett hopp kan kan inte återvända...
men efter ett anrop gör man det alltid...
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 3 maj 2014, 11:12:19
av Al_Bundy
Jag har löst problemet nu i koden, trots jag fick skriva om allt.

Varje funktion ger tillbaka ett värde och nu jag jag loopa om alla funktioner utan det blir stack overflow.
- Tackar!
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 3 maj 2014, 11:42:18
av sodjan
> en funktion ligger väl på ett annat ställe i koden?
> om programräknaren,
Du måste bestämma dig för om du betraktar hela problemet från
processorns synvinkel eller från C kodens sida. D.v.s att det är enklare
att välja sida av kompilatorn (före/efter) och stanna där tillsvidare.
Dessutom har de flesta processorer idag både GOTO och CALL implementerat
i hårdvaran och ett funktionsanrop i C kan mycket väl kompileras till ett CALL,
vilket normalt är implementerat som ett "hopp" med "extra allt", så att säga...
Som så ofta så medför förenklingar av verkligheten inte alltid att det blir
tydligare eller enklare att förstå. Bättre att förstå verkligheten direkt...
> Varje funktion ger tillbaka ett värde...
Just *det* är ju aldrig något direkt krav, men kan ofta vara praktiskt.
Void funktioner är den del av C standarden.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 3 maj 2014, 20:11:07
av Al_Bundy
Här är ett bevis på att jag kan programmera i C. Detta tog mig ca 24 timmar att koda och jag är så så klart nybörjare. Jag har använt mig inte av så mycket funktioner, men mest loopar som ser till så att om funktionen levererar fel värde så ska den köras om igen.
Det är ungefär så här:
Anropa funktion > funktion räknar ut > funktion ger tillbaka ett värde > en while-loop kontrollerar > osv.
Ni kanske inte förstå så mycket, men programmet frågar först 1 eller 2. Om jag väljer 1:an så får jag 5 stycken frågor, väljer jag 2:an får jag 2 frågor. Efter dessa frågor så ska en loop köras.
Kod: Markera allt
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 12
// pin 7 - Serial clock out (SCLK)
// pin 8 - Serial data out (DIN)
// pin 13 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 2 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 8, 13, 4, 2);
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// Deceleration for LED, relays, speaker
const int pin_led_green = 10; // green
const int pin_led_red = 9; // red
const int pin_relay1 = 11; // relay 1
const int pin_relay2 = 6; // relay 2
const int pin_tone = 5; // Speaker
void setup()
{
// Sett green and red LED output
pinMode(pin_led_green, OUTPUT);
pinMode(pin_led_red, OUTPUT);
pinMode(pin_relay1, OUTPUT);
pinMode(pin_relay2, OUTPUT);
digitalWrite(pin_relay1, HIGH);
digitalWrite(pin_relay2, HIGH);
// Sett a tone at start
tone(pin_tone, 400, 400);
// Flash with LED at start
digitalWrite(pin_led_green, HIGH);
digitalWrite(pin_led_red, HIGH);
delay(400);
digitalWrite(pin_led_green, LOW);
digitalWrite(pin_led_red, LOW);
display.begin(); // Begin to use the display
display.setContrast(50); // set contrast
display.clearDisplay(); // Remove the adafruit logo and clear!
sensors.begin(); // Start up the temperature library
}
void loop()
{
int choose = start();
const int maxi = choose;
int i = 0;
int fullBrewList[choose];
while (i < maxi)
{
fullBrewList[i] = brewFunc(i);
display.clearDisplay();
display.println("ONE");
display.println(i);
display.print(fullBrewList[i]);
display.display();
delay(1000);
// 100 = back
// 200 = Accept
if (fullBrewList[i] == 100 ) // Just back one question. i cannot be negative number.
{
if (i == 0)
{
i = i;
display.clearDisplay();
display.println("TWO");
display.print(i);
display.print(fullBrewList[i]);
display.display();
delay(1000);
}
else // back but ask the question again.
{
i = i - 1;
display.clearDisplay();
display.println("THREE");
display.print(i);
display.display();
delay(1000);
}
}
else if (fullBrewList[i] == 300) // ask the same question again.
{
i = i;
display.clearDisplay();
display.println("FOUR");
display.print(i);
display.display();
delay(1000);
}
else // Just keep forward and ask a new question
{
i = i + 1;
display.clearDisplay();
display.println("FIVE");
display.print(i);
display.display();
delay(1000);
}
}
}
int start()
{
display.clearDisplay();
display.println("*****MENU*****");
display.print("Press 1 or 2:");
display.display();
int temponaryKey = 1023;
while(temponaryKey != 1 || 2)
{
temponaryKey = tangent_key();
if (temponaryKey == 1)
{
display.clearDisplay();
display.print("You press: 1");
display.display();
delay(2000);
return 5;
}
else if (temponaryKey == 2)
{
display.clearDisplay();
display.print("You press: 2");
display.display();
delay(2000);
return 2;
}
else
{
display.clearDisplay();
display.println("Invalid number");
display.print("Try again");
display.display();
delay(2000);
tone(pin_tone, 800, 400);
display.clearDisplay();
}
}
}
int tangent_key() // press any key to choose metod
{
int tangent = 1023;
while(tangent == 1023)
{
// This is a voltage devider
while(tangent >= 1015)
{
tangent = analogRead(A5); // Analog pin 5
}
if (tangent > 585 && tangent < 595) // number 1
{
tone(pin_tone, 400, 400);
return 1;
}
else if (tangent > 50 && tangent < 60) // number 2
{
tone(pin_tone, 400, 400);
return 2;
}
else if (tangent > 370 && tangent < 390) // number 3
{
tone(pin_tone, 400, 400);
return 3;
}
else if (tangent > 999 && tangent < 1004) // number 4
{
tone(pin_tone, 400, 400);
return 4;
}
else if (tangent > 35 && tangent < 47) // number 5
{
tone(pin_tone, 400, 400);
return 5;
}
else if (tangent > 10 && tangent < 19) // number 6
{
tone(pin_tone, 400, 400);
return 6;
}
else if (tangent > 800 && tangent < 815) // number 7
{
tone(pin_tone, 400, 400);
return 7;
}
else if (tangent > 4 && tangent < 10) // number 8
{
tone(pin_tone, 400, 400);
return 8;
}
else if (tangent > 170 && tangent < 185) // number 9
{
tone(pin_tone, 400, 400);
return 9;
}
else if (tangent >= 0 && tangent < 1) // number 0
{
tone(pin_tone, 400, 400);
return 0;
}
else if (tangent > 855 && tangent < 875) // number 100 or B for back
{
tone(pin_tone, 400, 400);
display.clearDisplay();
return 100;
}
else if (tangent > 1006 && tangent < 1012) // number 200 or E for enter
{
tone(pin_tone, 400, 400);
display.clearDisplay();
return 200;
}
else
{
display.clearDisplay();
display.println("****ERROR****");
display.println("Try again");
display.print("Enter number");
display.display();
delay(3000);
tangent = 1023; // reset tangent to value 1023 and star over again
}
}
}
int brewFunc(int i)
{
int first;
int second;
String labels[5][5] = { {"*****TIME*****", "Dv0 time:", "Range 30-99:", String(first), String(second) },
{"*****TEMP*****", "Dv0 temp:", "Range 50-99:", String(first), String(second) },
{"*****TIME*****", "Dv1 time:", "Range 30-99:", String(first), String(second) },
{"*****TEMP*****", "Dv1 temp:", "Range 50-99:", String(first), String(second) },
{"***END TEMP***", "End temp:", "Range 50-99:", String(first), String(second) }};
// Display Menu, regulator and range
display.clearDisplay();
display.print(labels[i][0]); // Menu
display.println(labels[i][1]); // Device
display.println(labels[i][2]); // Range
display.display();
// Add first number
first = tangent_key();
delay(1000); // just to slow down
if (first == 100) // if press button B as furst number. Button B is value 100.
{
display.clearDisplay();
display.print("*****BACK*****");
display.print("Going back....");
display.display();
delay(1000);
return 100; // Just step back one question
}
else if (first == 200) // if press button E as furst number. Button E is value 200.
{
display.clearDisplay();
display.print("*****ERROR!***");
display.print("Not now!");
display.print("Returning.....");
display.display();
delay(1000);
return 300; // Just ask the same question again.
}
else
{
display.clearDisplay();
display.print(labels[i][0]); // Menu
display.println(labels[i][1]); // Device
display.println(labels[i][2]); // Range
display.print(first); // display the first value
display.display();
}
// Add second number
second = tangent_key();
delay(1000); // just to slow down
if (second == 100) // if press button B as furst number. Button B is value 100.
{
display.clearDisplay();
display.print("*****BACK*****");
display.print("Going back....");
display.display();
delay(1000);
return 100; // Just step back one question
}
else if (second == 200) // if press button E as second number. Button E is value 200.
{
while (second == 200)
{
display.clearDisplay();
display.print("*****ERROR!***");
display.print("Not E now!");
display.print("Enter number");
display.display();
delay(1000);
// Add a new second number
second = tangent_key();
delay(1000); // just to slow down
if (second == 100)
{
display.clearDisplay();
display.print("*****BACK*****");
display.print("Going back....");
display.display();
delay(1000);
return 100; // Just step back one question
}
else
{
// Nothing
}
}
// End of while-loop
display.clearDisplay();
display.print(labels[i][0]); // Menu
display.println(labels[i][1]); // Device
display.println(labels[i][2]); // Range
display.print(first); // display the first value
display.print(second); // display the second value
display.display();
delay(1000);
display.clearDisplay();
display.print("Keep value:");
display.print(String(String(first) += String(second) += "?")); // display first_second value.
display.display();
int Kepp_value = tangent_key();
delay(1000);
if (Kepp_value == 100) // Back = NO - Just go back to the same question again
{
display.clearDisplay();
display.print("*****BACK*****");
display.print("Going back....");
display.display();
delay(1000);
return 100; // 100 = Just step back one question
}
else if(Kepp_value == 200) // E = YES - Keep value
{
display.clearDisplay();
display.print("*****DONE*****");
display.print("Done");
display.print(".");
display.print(".");
display.print(".");
display.print(String(String(first) += String(second)));
display.display();
delay(1000);
return (String(String(first) += String(second))).toInt(); // Return the first_second value
}
}
else
{
display.clearDisplay();
display.print(labels[i][0]); // Menu
display.println(labels[i][1]); // Device
display.println(labels[i][2]); // Range
display.print(first); // display the first value
display.print(second); // display the second value
display.display();
delay(1000);
display.clearDisplay();
display.print("Keep value:");
display.print(String(String(first) += String(second) += "?")); // display first_second value.
display.display();
int Kepp_value = tangent_key();
delay(1000);
if (Kepp_value == 100) // Back = NO - Just go back to the same question again
{
display.clearDisplay();
display.print("*****BACK*****");
display.print("Going back....");
display.display();
delay(1000);
return 300; // 300 is back only to the same question again.
// Just return.
}
else if(Kepp_value == 200) // E = YES - Keep value
{
display.clearDisplay();
display.print("*****DONE*****");
display.print("Done");
display.print(".");
display.print(".");
display.print(".");
display.print(String(String(first) += String(second)));
display.display();
delay(1000);
return (String(String(first) += String(second))).toInt(); // Return the first_second value
}
}
}
Jag ska bara skriva den sista delen på koden, vilket är en loop som räknar ut tid och temperatur.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 3 maj 2014, 20:14:48
av Al_Bundy
sodjan skrev:> en funktion ligger väl på ett annat ställe i koden?
> om programräknaren,
Du måste bestämma dig för om du betraktar hela problemet från
processorns synvinkel eller från C kodens sida. D.v.s att det är enklare
att välja sida av kompilatorn (före/efter) och stanna där tillsvidare.
Dessutom har de flesta processorer idag både GOTO och CALL implementerat
i hårdvaran och ett funktionsanrop i C kan mycket väl kompileras till ett CALL,
vilket normalt är implementerat som ett "hopp" med "extra allt", så att säga...
Som så ofta så medför förenklingar av verkligheten inte alltid att det blir
tydligare eller enklare att förstå. Bättre att förstå verkligheten direkt...
> Varje funktion ger tillbaka ett värde...
Just *det* är ju aldrig något direkt krav, men kan ofta vara praktiskt.
Void funktioner är den del av C standarden.
Jo tackar!
Jag tittade lite på JSP diagram men det var ingen hitt för mig. Så jag körde bara på och hade i tanke att varje funktion (utom void) ska leverera ett värde och värdet ska skickas inom en loop som kontrollerar att om värdet återkommer så ska funktionen köras igen.
C är ett fantastiskt fint språk. Jag hoppas inte C++ ersätter den.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 00:25:36
av Magnus_K
Kan inte någon/TS förklara för mig vad i = i; gör för nytta i det här läget? I mina otränade ögon så lyder if-satsen så här:
Om i är lika med 0, gör följande: i är lika med 0 etc etc.
Vad är då syftet med detta? Om denna if-sats ska vara sann så krävs det väl att i == 0 vilket borde göra att deklarera i som 0 igen blir överflödigt?
Kod: Markera allt
if (i == 0)
{
i = i;
display.clearDisplay();
display.println("TWO");
display.print(i);
display.print(fullBrewList[i]);
display.display();
delay(1000);
}
EDIT: Ursäkta Al_Bundy om jag kapar din tråd lite!
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 01:10:14
av jesse
Tekniskt sett är det förstås helt onödigt att skriva i = i; men i det här fallet fyller det en programmerings-pedagogisk funktion.
För om man läser lite till i koden så finns det fler alternativ där i tilldelas andra värden, t.ex. i = i -1;
Ser man alla alternativen så finns det en logik i att man tilldelar i ett värde i alla alternativen. Kanske vill man experimentera med att ändra beteende i programmet och då lägger man bara till ett + 1 , -1 eller vad man nu vill ha efter i = i.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 01:13:36
av Magnus_K
Ah ok!
Ja jag såg att TS följde samma sorts mönster i varje "sammanhängande" if-sats vilket då i ett pedagogiskt syfte blir ganska logiskt. Bra, då fick jag svar på frågan, tack.
EDIT: Lagt till "sammanhängande"