Hei,
minulla on sellainen kirja lainassa kuin Introducing Speech and Language Processing. Kirjan mukana on cd, jossa on useita c- ja prolog-ohjelmia. Mutta kun yritin kääntää tätä tiedostoa komennolla "gcc -o coswave coswave.c", kääntäjä herjaa jotakin, että undefined reference to 'cos'. Mitenköhän ohjelman saisi toimimaan?
En tunne c:tä ollenkaan, mutta haluaisin kokeilla tätä ohjelmaa. Olen nyt Python-kurssilla, mutta sen enempää en ohjelmointia osaakaan.
Tässä lähdekoodi:
#include <stdlib.h> #include <stdio.h> #include <math.h> /* COSWAVE.C - Generates a cosine wave: 8000 samples, 1 s, 200Hz */ /* (when played at 8000 samples/s), called cosine.dat */ int main() { int length, status, i; short int *x; /* a pointer to the array of samples */ float freq; double arg, twopi; FILE *file_id; length = 8000; freq = 0.025; twopi = 8.0*atan(1.0); /* calculate 2*PI */ arg = twopi * freq; /* allocate the sample array and set its cells to zero */ x = (short int *) calloc(length,sizeof(short int)); if(!x) { printf("Unable to allocate space for samples\n"); exit(1); } /* Loop over the length of the array of samples */ /* Luulen, etta hairio on tassa kohtaa */ for (i = 0 ; i < length ; i++) x[i] = (short int) 32000 * cos(i*arg); file_id = fopen("cosine.dat","wb"); if(file_id == NULL) { printf("Unable to open file\n"); exit(1); } status = fwrite(x,sizeof(short int),length,file_id); if(status < length) { printf("Unable to write all samples\n"); exit(1); } fclose(file_id); return 0; }
Lisää käännöskomentoosi -lm, joka linkkaa mukaan matematiikkakirjaston (nimeltään yksinkertaisesti m).
Lisää kääntäjälle parametri -lm
, joka linkittää matematiikkakirjaston mukaan ohjelmaan. Hassua, että toisinaan GCC vaatii tuon mutta toisinaan ei: ainakin Arch Linuxin tämänhetkinen GCC linkittää tuon automaattisesti.
Kannattaa opetella tosiaan erottamaan käännösvirheet ja linkitysvirheet. Jälkimmäiset tunnistaa usein siitä, ettei niissä ilmoiteta rivinumeroa (koska linkitysvaiheessa ei enää ole koodirivejä vaan konekieltä).
Kiitos, sain sen nyt toimimaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.