Vinnaren i pepparkakshustävlingen!
2017-04-03, 16:16
  #2821
Medlem
har lite problem.
skriver siffror till en textfil.
jag vill få in sifforna från alla rader och räkna ut ett medel men vet ej hur.
medel värdet vill jag ha till en variabel efter de.
Citera
2017-04-03, 16:44
  #2822
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av nittrick
har lite problem.
skriver siffror till en textfil.
jag vill få in sifforna från alla rader och räkna ut ett medel men vet ej hur.
medel värdet vill jag ha till en variabel efter de.
Skriver till en textfil, inte läser från samma fil?
Det grundläggande du behöver är en variabel som räknar antalet tal (n) och en som sparar totalsumman av talen (s).
Sedan läsa in, någon sorts loop, ett tal (x) i taget och köra
s = s + x
n = n + 1

Vad har du gjort hittills?
Citera
2017-04-05, 13:38
  #2823
Medlem
försöker få till ett filter som kollar på den högsta nr jag får in på en ingång per sekund.
Kod:
if(init()==-1)
                exit(1);

        while(1)
        {
                adata=analogRead(0);
                printf("analog read %d\n",adata);
                if(adata==-1)
                printf("IO Error");
        }
        return 1;
}
de som är i printf vill jag besäkna högsta värdet varje sekund och skriva till en variabel (var=tid)

hittat en kod som räknar tiden och fixar de men sen tar de stopp för mig.
Kod:
time_t start, end;
        double elapsed; // seconds
        start = time(NULL);
        int terminate = 1;
        //Exit on failure to start communications with the GrovePi

        while (terminate) {
        end = time(NULL);
        elapsed = difftime(end, start);
        if (elapsed >= 1.0 /* seconds */)
        terminate = 0;
        else  // No need to sleep when 90.0 seconds elapsed.
        usleep(50000);
        }
i if satsen måste jag få in "adata" och skriva högsta värdet efter en seckund,

hela koden som den ser ut nu:
Kod:
  GNU nano 2.2.6          File: analogcurrentsensor.c                 Modified  

// GrovePi Example for using the analog read.
// http://dexterindustries.com/grovepi
#include <GrovePi.h>

int main(void)
{
        int adata;
        time_t start, end;
        double elapsed; // seconds
        start = time(NULL);
        int terminate = 1;
        //Exit on failure to start communications with the GrovePi

        while (terminate) {
        end = time(NULL);
        elapsed = difftime(end, start);
        if (elapsed >= 1.0 /* seconds */)
        terminate = 0;
        else  // No need to sleep when 90.0 seconds elapsed.
        usleep(50000);
        }



if(init()==-1)
                exit(1);

        while(1)
        {
                adata=analogRead(0);
                printf("analog read %d\n",adata);
                if(adata==-1)
                        printf("IO Error");
        }
        return 1;
}
Citera
2017-04-08, 12:01
  #2824
Medlem
Citat:
Ursprungligen postat av nittrick
försöker få till ett filter som kollar på den högsta nr jag får in på en ingång per sekund.
Kod:
if(init()==-1)
                exit(1);

        while(1)
        {
                adata=analogRead(0);
                printf("analog read %d\n",adata);
                if(adata==-1)
                printf("IO Error");
        }
        return 1;
}
de som är i printf vill jag besäkna högsta värdet varje sekund och skriva till en variabel (var=tid)

hittat en kod som räknar tiden och fixar de men sen tar de stopp för mig.
Kod:
time_t start, end;
        double elapsed; // seconds
        start = time(NULL);
        int terminate = 1;
        //Exit on failure to start communications with the GrovePi

        while (terminate) {
        end = time(NULL);
        elapsed = difftime(end, start);
        if (elapsed >= 1.0 /* seconds */)
        terminate = 0;
        else  // No need to sleep when 90.0 seconds elapsed.
        usleep(50000);
        }
i if satsen måste jag få in "adata" och skriva högsta värdet efter en seckund,

hela koden som den ser ut nu:
Kod:
  GNU nano 2.2.6          File: analogcurrentsensor.c                 Modified  

// GrovePi Example for using the analog read.
// http://dexterindustries.com/grovepi
#include <GrovePi.h>

int main(void)
{
        int adata;
        time_t start, end;
        double elapsed; // seconds
        start = time(NULL);
        int terminate = 1;
        //Exit on failure to start communications with the GrovePi

        while (terminate) {
        end = time(NULL);
        elapsed = difftime(end, start);
        if (elapsed >= 1.0 /* seconds */)
        terminate = 0;
        else  // No need to sleep when 90.0 seconds elapsed.
        usleep(50000);
        }



if(init()==-1)
                exit(1);

        while(1)
        {
                adata=analogRead(0);
                printf("analog read %d\n",adata);
                if(adata==-1)
                        printf("IO Error");
        }
        return 1;
}

Varför använder du negativ logik?

Kod:
terminate = 1;
while (terminate) {
    ...
    if (xx) terminate = 0;
}
Variabeln 'terminate' antyder ju extremt starkt att du skall bryta loopen om den är satt. Du gör tvärt om.

Varför variabelnamn som gör att du behöver trycka in kommentarer för att hjälpa till?
Kod:
if (elapsed >= 1.0 /* seconds */) {
    ...
}
Variabeln 'elapsed_seconds' skulle ju göra att varje rad som använder variabeln upplyser användaren om att den innehåller förbrukad tid i sekunder.

Sedan har du en kommentar om 90 sekunder utan att koden verkar göra någonting relaterat till 90 sekunder.

Vill du ha högsta mätvärdet då får in under en sekund så måste du ju starta någon form av tidtagning och sedan hämta in så många mätvärden du kan/önskar under din mätperiod. Om vi antar att din ADC bara kan ge icke-negativa värden så kan du sätta en variabel 'max' till -1. För varje avläsning kollar do om avläsningen är > max - i så fall tilldelar du det nya maxvärdet.

Repetera tills din mätperiod är slut och skriv sedan ut.
Citera
2017-05-23, 22:33
  #2825
Medlem
Är det möjligt att använda templates med list? Typ såhär: list<T>lista; Syftet är att låta användaren själv välja om listan ska hantera heltal eller deltal.
Citera
2017-06-01, 08:36
  #2826
Medlem
Citat:
Ursprungligen postat av Tiger-Lily
Är det möjligt att använda templates med list? Typ såhär: list<T>lista; Syftet är att låta användaren själv välja om listan ska hantera heltal eller deltal.

Japp
Citera
2017-06-01, 11:03
  #2827
Medlem
kaks avatar
Citat:
Ursprungligen postat av datapojken
Japp
Inte om du med användaren menar den som kör ditt program.
Valet måste göras vid kompileringstillfället.
Citera
2017-06-02, 07:46
  #2828
Medlem
Citat:
Ursprungligen postat av kak
Inte om du med användaren menar den som kör ditt program.
Valet måste göras vid kompileringstillfället.

Självklart kan man designa ett program som låter användaren använda den datatyp som behagas. men jag förstår vad du menar med dynamisk bindning och allt
Citera
2017-06-25, 13:11
  #2829
Medlem
Astalons avatar
Försöker skriva ett program som ska ta in ett användarnamn och en ålder, som ska vara säkert nog att man inte kan stoppa in exempelvis en sträng i åldern och lite sådant. Mitt program är inkonsekvent och får inte riktigt bukt på varför.. Länge sedan jag satt med C.

Är åldersfunktionen som jag har strul med.
Kod:
void getAge(char *age, unsigned long int size){
  printf("Enter age, maximum age is 9999: ");
  fgets(age, size, stdin);
  checkQuit(age);
  int length =stLen(age);
  if(length==0 || (length==1 && age[0]=='0')){ //Special first case not covered by below
    printf("Wrong format of age.\n");
    getAge(age, size);
  }

  if(5>length>0){ //Length check, less than five and not 0.
    for (size_t i = 0; i < length; i++) { //Check all characters ascii value for digits.
      if(age[i]>57 || age[i]<48){ // If we find one thats not a digit, start over.
        printf("Wrong format of age. Ascii\n");
        getAge(age, size);
      }
    }
  }else{
    printf("Wrong format of age. Length\n");
    getAge(age, size);
  }
}

Nedan är ett antal testkörningar.
Please enter your user name: gyera
Enter age, maximum age is 9999: 123
Ovan är önskat beteende

Please enter your user name: gyera
Enter age, maximum age is 9999: gyera
Wrong format of age. Length
Enter age, maximum age is 9999: 123
Ovan är också önskat beteende.

Please enter your user name: keir
Enter age, maximum age is 9999: keir
Wrong format of age. Ascii
Enter age, maximum age is 9999: 123
Wrong format of age. Ascii
Enter age, maximum age is 9999: 123
Ovan här tycker jag att vid första input av 123 med age så borde programmet terminera. Någon som har förslag?
Citera
2017-06-25, 13:29
  #2830
Moderator
Protons avatar
Citat:
Ursprungligen postat av Astalon
Försöker skriva ett program som ska ta in ett användarnamn och en ålder, som ska vara säkert nog att man inte kan stoppa in exempelvis en sträng i åldern och lite sådant. Mitt program är inkonsekvent och får inte riktigt bukt på varför.. Länge sedan jag satt med C.

Är åldersfunktionen som jag har strul med.
Kod:
void getAge(char *age, unsigned long int size){
  printf("Enter age, maximum age is 9999: ");
  fgets(age, size, stdin);
  checkQuit(age);
  int length =stLen(age);
  if(length==0 || (length==1 && age[0]=='0')){ //Special first case not covered by below
    printf("Wrong format of age.\n");
    getAge(age, size);
  }

  if(5>length>0){ //Length check, less than five and not 0.
    for (size_t i = 0; i < length; i++) { //Check all characters ascii value for digits.
      if(age[i]>57 || age[i]<48){ // If we find one thats not a digit, start over.
        printf("Wrong format of age. Ascii\n");
        getAge(age, size);
      }
    }
  }else{
    printf("Wrong format of age. Length\n");
    getAge(age, size);
  }
}

Nedan är ett antal testkörningar.
Please enter your user name: gyera
Enter age, maximum age is 9999: 123
Ovan är önskat beteende

Please enter your user name: gyera
Enter age, maximum age is 9999: gyera
Wrong format of age. Length
Enter age, maximum age is 9999: 123
Ovan är också önskat beteende.

Please enter your user name: keir
Enter age, maximum age is 9999: keir
Wrong format of age. Ascii
Enter age, maximum age is 9999: 123
Wrong format of age. Ascii
Enter age, maximum age is 9999: 123
Ovan här tycker jag att vid första input av 123 med age så borde programmet terminera. Någon som har förslag?
Vilken WTF-bonanza du kokat ihop här.

Varför inte använda det som finns inbyggt, till exempel atoi? Då slipper du ju typa om saker själv, dessutom gör den troligen mer rätt än dina egna hopkok.

Kolla på https://www.tutorialspoint.com/c_sta...ction_atoi.htm så ska du få se en aningen smidigare sak än din manick. Med mindre rader kod borde ditt program dessutom kunna göras mer läsligt och därmed borde du även kunna hitta problemet med den felaktiga termineringen lättare.
Citera
2017-06-25, 22:07
  #2831
Medlem
Astalons avatar
Då var jag här igen. Tack för ovan svar.

Nytt problem med filer och I/O. Jag har en fil med numrerade rader som jag vill skriva ut utan att ha radnumreringen med. Att skriva ut allt med numrering är inga problem. När jag försöker extrahera bort radnumreringen så blir det lite strul, försökt att hitta felet själv med GDB men blir inget klokare.

Vad filen består av:

1. Assamese/Asomiya
2. Bengali/Bangla
3. Bodo
4. Dogri
5. Gujarati
6. Hindi
7. Kannada
8. Kashmiri
9. Konkani
10. Maithilis
11. Malayalam
12. Manipuri
13. Marathi
14. Nepali
15. Oriya
16. Punjabi
17. Sanskrit
18. Santhali
19. Sindhi
20. Tamil
21. Telugu
22. Urdus


Kod:
void extractWord(char *word, char **store){
  int length = strlen(word);
  if(length==0 || word==NULL){
    return;
  }
  
  for(int i = 0; i<length; i++){//Loop over string, return pointer to start of actual word
    if(word[i]<91 && word[i]>64){
      *store = (word+i); //Store location of how far we iterated
    }
  }
}

int main(){
  
  int counter = 0;
  FILE *fpb = fopen("bats.txt", "a+");
  char *tmpStore = calloc(1, 20);
  char *tmpWord = calloc(1, 20);

  
  while(fgets(tmpStore, 20, fpb)){
    //extractWord(tmpStore, &tmpWord);
    printf("%s", tmpStore);
  }
  
  return 0;
}

Genererar output
AsomiyaAsomiyaBangla
Bodo
Dogri
Gujarati
Hindi
Kannada
Kashmiri
Konkani
Maithilis
Malayalam
Manipuri
Marathi
Nepali
Oriya
Punjabi
Sanskrit
Santhali
Sindhi
Tamil
Telugu
Urdus

Lyckas inte lösa detta. Någon klok därute som ser mitt klaviertramp?
Citera
2017-06-26, 16:23
  #2832
Moderator
Protons avatar
Citat:
Ursprungligen postat av Astalon
Då var jag här igen. Tack för ovan svar.

Nytt problem med filer och I/O. Jag har en fil med numrerade rader som jag vill skriva ut utan att ha radnumreringen med. Att skriva ut allt med numrering är inga problem. När jag försöker extrahera bort radnumreringen så blir det lite strul, försökt att hitta felet själv med GDB men blir inget klokare.

Vad filen består av:

1. Assamese/Asomiya
2. Bengali/Bangla
3. Bodo
4. Dogri
5. Gujarati
6. Hindi
7. Kannada
8. Kashmiri
9. Konkani
10. Maithilis
11. Malayalam
12. Manipuri
13. Marathi
14. Nepali
15. Oriya
16. Punjabi
17. Sanskrit
18. Santhali
19. Sindhi
20. Tamil
21. Telugu
22. Urdus


Kod:
void extractWord(char *word, char **store){
  int length = strlen(word);
  if(length==0 || word==NULL){
    return;
  }
  
  for(int i = 0; i<length; i++){//Loop over string, return pointer to start of actual word
    if(word[i]<91 && word[i]>64){
      *store = (word+i); //Store location of how far we iterated
    }
  }
}

int main(){
  
  int counter = 0;
  FILE *fpb = fopen("bats.txt", "a+");
  char *tmpStore = calloc(1, 20);
  char *tmpWord = calloc(1, 20);

  
  while(fgets(tmpStore, 20, fpb)){
    //extractWord(tmpStore, &tmpWord);
    printf("%s", tmpStore);
  }
  
  return 0;
}

Genererar output
AsomiyaAsomiyaBangla
Bodo
Dogri
Gujarati
Hindi
Kannada
Kashmiri
Konkani
Maithilis
Malayalam
Manipuri
Marathi
Nepali
Oriya
Punjabi
Sanskrit
Santhali
Sindhi
Tamil
Telugu
Urdus

Lyckas inte lösa detta. Någon klok därute som ser mitt klaviertramp?
Det ser ju ut som om du proppar in alldeles för mycket i ditt word i början. Lustigt nog verkar det bara vara när namnen innehåller tecknet "/" som det strular, resten ser ju ut att funka?

Är det för att programmet får för sig att / är en del av nån escapesekvens som det strular tro, fast då borde det vara ett "\" snarare?
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback