- Samsung Galaxy Z Fold7 - ezt vártuk, de…
- Milyen okostelefont vegyek?
- Samsung Galaxy Watch8 - Classic - Ultra 2025
- Telekom mobilszolgáltatások
- Honor Magic5 Pro - kamerák bűvöletében
- Redmi Note 13 Pro 5G - nem százas, kétszázas!
- Leesett a kamionról több millió eurónyi Z Fold7
- iPhone topik
- Honor 200 Pro - mobilportré
- One mobilszolgáltatások
Hirdetés
Talpon vagyunk, köszönjük a sok biztatást! Ha segíteni szeretnél, boldogan ajánljuk Előfizetéseinket!
-
Mobilarena
Új hozzászólás Aktív témák
-
emitter
őstag
válasz
Gyomman #2493 üzenetére
Próbáld meg ezt: [link]
Nemtom, mennyire az alapoktól indul, már jó régen raktam be a könyvjelzők közé
Ha nem érthető, akkor nem tudok segíteni. Ezesetben szerintem semmilyen könyvből nem fogsz megtanulni, mert kell egy alapvető programozói gondolkozás/készség.
Az előnyös lenne, ha találnál olyan ismerőst, aki el tudja magyarázni az alapokat..
Sok sikert! -
emitter
őstag
struct position {
int turm;
int welche;
} scheiben[];
...
scheiben[j] = (struct position*)malloc(sizeof(struct position));
erre miért kapom azt a hibát, hogy ''incompatible types in assignment''?? (eléggé elszoktam a c-től, jó féléve nem használtam.. biztos vmi triviális dolog van mögötte..)
thx
[Szerkesztve] -
emitter
őstag
válasz
Forest_roby #2020 üzenetére
hogyha a főprogiból hívod a on_quit1_activate fv-t, akkor a hívása után rakj be egy
return 1;
sort, ezzel ki is lép a progiból
vagyis mégjobb, ha egy exit()-gyel lépsz ki, így ezt akár egy fv-en belül is megteheted.. mondjuk nem tudom, mennyire szép megoldás ez
tehát:
...
on_quit1_activate(...);
exit(EXIT_SUCCESS);
...
[Szerkesztve] -
emitter
őstag
válasz
Forest_roby #2018 üzenetére
nem értek az ablakozáshoz, de egy return() a főprogiban nem oldaná meg?
-
emitter
őstag
válasz
Forest_roby #1960 üzenetére
-c Compile and assemble, but do not link
^-- ezt csinálja a -c
Szóval nincs ilyen fv, h outp().. akkor lehet, h az ncursesben ezt nem implementálták.
A libconio-val kéne próbálkozni
------
mod:[link]
sztem megpróbálkozhatnál ezzel
[Szerkesztve] -
emitter
őstag
válasz
Forest_roby #1958 üzenetére
ha hiányozna, kiabálna fordításkor..
_outp()-vel mit csinál? -
emitter
őstag
válasz
Forest_roby #1956 üzenetére
mi az az ltp.out?? ez a bináris lett a forrásodból?
nemtom, esetleg megpróbálhatsz egy hívást strace-szel
[Szerkesztve] -
emitter
őstag
válasz
Forest_roby #1951 üzenetére
sudo apt-get install libncurses5
és persze nem conio.h-t húzolbe, hanem ncurses.h-t
---
szerk: de az is lehet, h a fv. neve nem _outp, hanem simán outp
talán segít: [link]
[Szerkesztve] -
emitter
őstag
-
emitter
őstag
no, ma leadtam a wav-játszós nagyházimat c++ból, 5ös lettem
de nem hagyom abba a fejlesztést, sok mindnet akarok még bővíteni, mert ennek látom értelmét (a tavalyi aknakereső annyira nem fogott meg)
pl. akarok mp3-at belerakni, lejátszólistát tudjon, lehessen tekerni benne, esetleg hangerőt állítani, ilyesmik... egész jó lesz -
emitter
őstag
válasz
emitter #1740 üzenetére
#include <iostream>
using namespace std;
int main()
{
int age;
cout<< ''How old are you?'';
cin>> age;
cin.ignore();
if ( 0 < age && age < 18 ){
cout<< ''You are young.'';
}
else if ( 19 < age && age < 40 ){
cout<< ''The life is still in front of you'';
}
else if ( 41 < age && age < 70 ){
cout<< ''There is still time for you...'';
}
else{
cout<< ''You shouldn't start to read War And Peace'';
}
cin.get();
}
--------
a fenti kód megy, csak ki kell cserélni a ' '-eket ''-ekre.. a fórummotor konvertálgat..
Jester ja, igazad van, közben rájöttem
[Szerkesztve] -
emitter
őstag
válasz
-=Lord Tom=- #1739 üzenetére
nem zárójelezel
az operátor precedencia miatt gondolom mindig az utolsó else-ág hajtódik végre.. meg a cin.get() közvetlen a main vége elé kellene, mert így csak a 70 év felettieknél fogja kérni a bill-leütést
szóval zárójelek, pl.
if ( (0 < age) && (age < 18) ){
...
hmm mégse, nem kell zárójelezés.. akkor nemtm mi a baj.. nekem műxik
[Szerkesztve] -
emitter
őstag
válasz
-=Lord Tom=- #1737 üzenetére
na, az a warning volt az, csak valami másik fülre kell ilyenkor kattintani, ahol részletesen le vannak írva a warningok, errorok.. most nincs előttem visual, de suliban azt használunk, szal annak ott kell lennie valahol
-
emitter
őstag
válasz
-=Lord Tom=- #1734 üzenetére
mert a tizedesjel nem , hanem .
-
emitter
őstag
válasz
authgabor #1729 üzenetére
igen, tudom, talán csak azért kérdeztem
mert még nem találkoztam normálisan összeszedett Javascriptes oldallal (mint amilyennek a Te Java-s lapod készül)
szóval ez teljesen nyitott lesz, bárki küldhet cikket, de lesz, aki moderálja, vagy ilyesmi?
itt ez lassan kezd OFF lenni, nyithatnánk neki egy külön topikot -
emitter
őstag
ha egy programból megnyitok egy socketet, majd utána meghívok system()-mel egy külső programot, és ennek a külső proginak szeretném átadni a socket leíróját, hogy ő is tudjon ugyanazon kommunikálni.. ez menni fog szerinted? szóval elég egy int-értéket átadni, közben nem fog bezáródni a socket?
-
emitter
őstag
ha egy egész sort szeretnék olvasni egy textfájlból, azt hogyan?
az a baj, h szóközök is vannak a srban, így fscanf()-fel nem jó a móka
fscanf(handle, ''%s'', data); -
emitter
őstag
válasz
sghc_toma #1715 üzenetére
char tmp[20], host[20];
...
strcpy(tmp, '' '');
host = strcat(tmp, host);
...
hmm, így jó, viszont most meg az strcat rinyál:
call_wav_server.cpp:80: error: incompatible types in assignment of 'char*' to 'char [20]'felettébb érdekes.. amúgy mi számít const char*-nak? amit én adok meg ''''-ek között?
-
emitter
őstag
válasz
sghc_toma #1712 üzenetére
most meg pl. ennél szegmenshibázik:
...
char *server_app;
...
else strcpy(server_app, ''./wav_server'');
...
amúgy így sima értékadással télleg nem lehet sztringeket másolni?csak már keverek mindent, és nincs itt a C-könyvem, h utánanézhessek
szerk: ezt főleg azért nem értem, mert ez meg jó:
...
char *tmp;
...
strcpy(tmp, '' '');
...
[Szerkesztve] -
emitter
őstag
itt is megkérdezem:
strcat() miért ad szegmens hibát, ha egy sztring elejére egy szóközt akarok biggyeszteni
...
char* tmp;
char* port;
...
tmp = '' '';
port = argv[2];
port = strcat(tmp, port);
...
thx -
emitter
őstag
válasz
Terrorista #1708 üzenetére
akkor én kérdezek: mi az h programterv?
folyamatábra
-
emitter
őstag
válasz
Terrorista #1705 üzenetére
nekem is most kell majd a progimhoz egy doksit írni, igaz németül
nekem inkább az a bajom, h nemtom, mennyire írjam részletesre, mármint a programozói részét.. merthát a juzereknek nem lehet túl sokat rizsálni, lévén kevés funkcijó
viszont maga a forrás bő 1000 soros, szóval arról van mit mesélni - majd holnap nekiugrom
a felhasználói részre szvsz kezdd el úgy, hogy mire használható a progi, aztán indítástól részletezd lépésenként, hogy mit lehet csinálni vele, mit csinál a cucc, ha ezt vagy azt választod ki, stb. Én legalábbis az előző doksimat kb így írtam, és 5ös lett...
Ja, meg debugger infók is kellenek, jól ki kell védni a juzer hülyeségeit, ezeket alaposan el kell magyarázni a leírásban..
sok sikert neked is! -
emitter
őstag
válasz
emitter #1689 üzenetére
ZSÍÍÍÍR!!!!!
Kész a wav-lejátszóm! Minden mvprintw után refresh() kellett, azért nem ment eddig
A lejátszás szüneteltetését pedig egy alsa-pause hívással kellett megoldani... nem is olyan bonyolult, csak rá kellett jönnöm
Akit érdekel, itt a kód
szerver: [link]
kliens: [link]
szóval van egy hálózatos wav-játszó progi, amit lehet pause-zni, kb ennyit tud (egyelőre)
még meglátom, h mp3-at is implementáljak, feltéve, h nem túl nehéz
Jester01: Neked külön is köszönöm a sok segítséget (mint mindig)
ui: még annyi probléma merül fel néha, h indításkor rögtön snd_pcm_writei() failed, de ez kb 5%-ban fordul elő.. csak gőzöm sincs miért..
meg próbáltam puffert berakni (listával), egyelőre sikertelenül (ott van csak kommentelve)
kicsit gyorsítva játsza, és ki-ki hagy
azért még debuggolom, csak ha valami szarvashiba elsőre feltűnne esetleg, az sokat segítene -
emitter
őstag
neked meg mindenképp azt ajánlom, hogy áruld el a feladatod mibenlétét, mert így nagyon nehéz segíteni
NEM röhögünk ki senkit, ha bizonytalan vagy, privizhetsz is
amúgy realtime akármilyen programot szövegszerkesztésre használva szvsz lehetetlen ilyet csinálni.. vagy ahhoz már a billentyűzet driverjét kéne átírni -
emitter
őstag
válasz
aranyosij #1694 üzenetére
ez választható feladat vagy mi? ha ránézésre nem tudod eldönteni, hogy bonyolult-e vagy nem, akkor meggondolnám a helyedben, mielőtt belevágom a fejszémet
azért itt egy jó kis leírás [link] a hálózatos programozás alapjairól, neked különösen ajánlom átolvasni a ''6.2. select() - Szinkron I/O Multiplexelés'' részt, azon belül találsz egy nagyon egyszerű példát egy chat-programra, amit továbbfejleszthetsz
sok sikert!
mod: a link
[Szerkesztve] -
emitter
őstag
miért nem működik nálam az mvprintw??
...
initscr();
clear();
mvprintw(1, 0, ''mvprintw'');
...
nem ír ki semmit, viszont cout-tal működikemlékeszem, régebben már kipróbáltam ezt a kiírófv-t, és ment
ncurses.h-t behúzom, nem is kapok semmi hibát, mégsem jó -
emitter
őstag
válasz
Jester01 #1687 üzenetére
köszi, erre a select-es bibre sosem jöttem volna rá magamtól
most már nem eszik prockót
a ciklus azért fut bufsize-ig, mert akkora a puffer (wav_buf) mérete (ami ugye shortokat tartalmaz)
ha átírom a cilusokat, és csak readbytes-ig futnak, akkor már tényleg megszólal a zene, de nagyon zavarosan, zajosan.. ez nem tudom mitől lehet
(frissítettem a forrásokat a neten)
másrészt azért is gondolom, h a cilusoknak bufsize-ig kell futniuk, mert itt van pl. ez a progi [link], ez volt az alapja a wav-lejátszásnak, és itt is bepakolom a wavot egy listába (egy bufsize-ih futó ciklussal), amiből szépen vissza is tudom rakni a pufferba.. na és ha ebben a progiban átírom a ciklust, és csak readbytes-ig fut, akkor néha ugyan jól lejátsza a wavot, de sokszor hibát ad vissza az snd_pcm_writei()szóval ezért maradnék a bufsize-ig futó cilkusnál
[szerk: ] ja és a buflevel nem a listában lévő bájtok számát mutatja, hanem a benne lévő wav_buf-ok számát, azaz pl ha buflevel 16, akkor van benne 16*bufsize*sizeof(short) bájt
[Szerkesztve] -
emitter
őstag
vajon miért nem működik az én kis pufferelő lejátszóm? belerakom a short típusú wav-adatokat egy listába, majd megvárom, míg eléggé feltöltődik, ezután elkezdem lejátszani
------
list<short> wavList;
...
if( ctrl == PLAY ){
numbytes = recv(data_fd, wav_buf, wi->bufsize*sizeof(short), 0);
if (numbytes == -1) {
perror(''recv'');
exit(0);
}
if (numbytes == 0){ //a kliens befejezte a beszelgetest
break;
}
if(buflevel > 16){
for(i=0; i < wi->bufsize; i++){
wav_buf = wavList.front();
wavList.pop_front();
}
if(snd_pcm_writei (wi->playback_handle, wav_buf, readbytes) < 0) {
cout << ''\nFehler\n'';
exit(0);
}
buflevel--;
}
for(i=0; i < wi->bufsize; i++){
wavList.push_back(wav_buf);
}
buflevel++;
}
...
---------
szóval: megvárom, míg 16 db lejátszanivaló adag összegyűlik a listában, ezután rakom vissza a listából
ha nem használok listát biztonsági pufferként, akkor rendesen lejátsza, de nekem kéne puffer
a másik, hogy ha a kliensben lepausézom a lejátszást, hirtelen megugrik a procihasználat és ott is marad - pedig a serverben és a kliensben is select-tel figyelem a hálózati aktivitást, és az elvileg nem eszik procit..
a források:
server: [link]
kliens: [link]
szerk: a pause funkció még nem okés, de sztem csak azért nem, mert nem működik még a biztonsági puffer, így ha pause-zott állapotában kap a server egy Play-jelet, előbb küldené a puffert a hangkártyának, mint átérkezett volna a friss adag wav...
[Szerkesztve] -
emitter
őstag
válasz
Jester01 #1679 üzenetére
nem igazán értem, ami gondolsz..
beraktam, vagy nem így kéne?
----------
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_SET(STDIN, &readfds);
FD_SET(data_fd, &writefds);
while(!feof(handle)){
tv.tv_sec = 0;
tv.tv_usec = 0;
select(data_fd+1, &readfds, &writefds, NULL, &tv);
if( FD_ISSET(STDIN, &readfds) ){
cout << ''\nBillentyu lenyomva!\n'';
exit(1);
...
--------
mit jelent az hogy lehet írni a hálózatra? ezt nem értettem
szerk: ja elfelejtettem hogy így sem megy - hiába nyomom akár folyton az entert, nem lép ki a progiból
[Szerkesztve] -
emitter
őstag
újra a select()-tel vannak problémáim... mégpedig az, hogy túl nagy a minimum-időintervalluma (1 mikrosec.), amíg várakozik
nekem nagyon kicsi ideig kéne csak h megnézze az STDIN-t, különben nem tudja a progi elég gyorsan adagolni a hálózatra a wavot...
ja és mindez azért kéne, hogy tudjak wavjátszás közben pause-zni, stb.
most így selectelek:
---------
fd_set readfds;
struct timeval tv;
...
FD_ZERO(&readfds);
FD_SET(STDIN, &readfds);
while(!feof(handle)){
tv.tv_sec = 0;
tv.tv_usec = 1; // még 1 usec is nagyon sok idő neki
select(STDIN+1, &readfds, NULL, NULL, &tv);
if( FD_ISSET(STDIN, &readfds) ){
cout << ''\nBillentyu lenyomva!\n'';
return 0;
}
...//itt olvasok a wavból, és send()-elem el
------nagyon jó lenne, ha nem kéne lemondanom a lejátszás vezérléséről... szóval csak van erre vmi megoldás
-
emitter
őstag
válasz
emitter #1675 üzenetére
az az érzésem, hogy a send lényegesen gyorsabban küldi az adatokat, mint ahogy én fogadni meg közben lejátszani tudom... ez előfordulhat? mert csak 2-3x fut le a main loop a szervernél, azaz csak 2-3x írja ki, h ''readbytes: xx'', bár ezt is rosszul, mert csak az első kiírásnál helyes az adat..
-
emitter
őstag
válasz
emitter #1672 üzenetére
asszem megvan: a new hívás után ráállítottam még a data-t egy másik változó címére...
szóval pl ehelyett
data = &wi.channels;
ezt írom:
*data = wi.channels;
de így sem jó a dolog, éppúgy csak az első átvitt adat helyes, a több random
akkor mi történik, ha nem new-val rakok alá memót, hanem simán alátolom egy létező válozó címét - és ezután kiadok egy delete data; utasítást? ekkor csak leáll róla, vagy törli a wi.channels-t?
pl.
data = &wi.channels;
delete data; -
emitter
őstag
válasz
Jester01 #1671 üzenetére
ha egymás után többször írok ilyet:
-----
data = new int;
...
delete data;
-----
(előtte van egy int* data;), szal miért dob ilyet? a server progiban ugyanezt csinálom, ott nem ad hibát..
*** glibc detected *** double free or corruption (!prev): 0x0804b010 ***
felraktam a forrásokat -
emitter
őstag
válasz
Jester01 #1663 üzenetére
értem, köszi
ez egyre jobb.. teljesen kész vagyok: fordítom mindkét progit (server, kliens), ezután első futtatásra teljesen jól átjönnek az adtaok, minden OK, úgy ahogy szeretném
ezután második futtatásra már tök random cuccok érkeznek megez mitől lehet?!
csak az újrafordítás segít ezen..
na, felrakom a forrásokat, íme
server: [link]
kliens: [link] -
emitter
őstag
válasz
Jester01 #1661 üzenetére
igazad volt, még így látatlanban is megtaláltad a hibát
most viszont már a send() és recv() hívásokkal vagyok bajban, mert kiküldök send-del egymás után 3 adatot (mindegyik más hosszúságú char*), majd ezeket szeretném recv-elni, ami nem sikerül.. az első adat rendben megérkezik, a többi viszont sehogy sem akar eredeti formájában megérkezni..
ha jól tudom, ezek a hívások blokkolnak, szóval olyan nem lehet, hogy elmulasztok egy adatcsomagot a szinkronizáció hiánya miatt, ugye?
a kódot azért nem raknám be, mert tele van mindenféle debug-kiíratásokkal, még nekem is nehéz átlátnide ha gondolod, belinkelhetem..
szóval elvileg előfordulhat olyan, hogy sendelek 1 csomagot, megérkezik (ezután a fogadó oldalon csinálok egy csomó mindent - emiatt elképzelhető, hogy a következő csomag még eközben érkezik meg, így a fogadó fél lecsúszik a fogadásáról? van ilyen - vagy az oprendszer eltárolja vmi bufferban a beérkezett csomagokat?) -
emitter
őstag
válasz
Jester01 #1659 üzenetére
sprintf() köszi! ezzel jó
viszont újabb értelmetlen dolog előtt állok, van ez a kódrészlet:
cout << ''elotte\n'' << endl;
fseek(handle, wi.fp, SEEK_SET);
cout << ''utana\n'' << endl;
//komment kezdete
sprintf( buf_int, ''%d'', wi.sample_rate);
i = strlen(buf_int);
if(send(data_fd, buf_int, i, 0) == -1){
perror(''send'');
exit(1);
}
sprintf( buf_int, ''%d'', wi.bits_per_sample);
i = strlen(buf_int);
if(send(data_fd, buf_int, i, 0) == -1){
perror(''send'');
exit(1);
}
//komment vege
cout << ''elotte\n'' << endl;
fseek(handle, wi.fp, SEEK_SET);
cout << ''utana\n'' << endl;
----------
namost ez a következőt csinálja:
elotte
utana
elotte
Szegmens hiba
ha viszont a ''komment kezdete'' és a ''komment vege'' közti részt kikommentelem, akkor nem ad hibát, hanem
elotte
utana
elotte
utanatelejesen értetlen vagyok..
-
emitter
őstag
linuxon hogyan tudok integerből, ill. short-ból char*-ot csinálni?
stdlib.h-beli itoa()-ra ''was not declared in this scope'' dob..
másik kérdés, hogy fordítva hogyan tudok shortot csinálni a char*-ból? integer megy egy sima (int) castolással, de short-ra nem engedi, merthogy elveszti a pontosságát a szám - ez logikus, de akkor hogyan csináljam -
emitter
őstag
válasz
emitter #1646 üzenetére
most még annyit kéne alakítani rajta, hogy legyen egy olyan pufferem, aminek a szintjét nem engedem pl. 30% alá menni (ez jó lenne a hálózati sebesség-ingadozások ellen)
szóval ebbe a nagy-nagy pufferba kéne pakolni sok-sok ilyen listát.. namost ezt hogyan
[Szerkesztve] -
emitter
őstag
válasz
Jester01 #1643 üzenetére
hehe
télleg!
akkor azt hogyan oldjam meg, hogy a listába 4096bájt méretű elemeket pakoljak? merthogy nekem nem csak egy elem első bájtját kell átküldenem majd a hálózaton hanem mindet
vagy nem is kell 4096, de mondjuk 256 azért kellene..
Tyrael: nem tudom, nem lenne-e túl lassú tőle a dologde lehet h kipróbálom
[Szerkesztve] -
emitter
őstag
az hogyan lehet, hogy én egy list<short>-ba bele tudok gyömöszölni pl 4096 bájtot?
így csinálom:
...
list<short> myList;
short *buf;
...
bufsize=4096;
i = fread(buf, 1, bufsize, handle);
myList.push_back(*buf);
*buf=myList.front();
...
snd_pcm_writei (playback_handle, buf, tmp);
...
és jól lejátsza a cuccostszóval ezt hogyan?
-
emitter
őstag
hát én ebből azt szűrtem le, hogy van a ''data'' string a 40-es offsettől, majd 4 bájt SubChunkSize (nemtom miez), majd így a 48.ik offset-től kezdődik az igazi stream
következőképpen:
mintánként 2 bájt bal-, majd 2 bájt jobb csatorna (egy hexa-kód (szám, betű) 4bit - tehát ha egy minta 3c f2 24 f2, akkor ebből 2 bájt (3c f2) a bal csati, és 2 bájt ( 24 f2) a jobb csati)
nem műxik így? azt nem tudom, h ez a szabványos wav, de elvileg annak kell lenni, mert nem írták, h nem így lenne
[Szerkesztve] -
emitter
őstag
válasz
Jester01 #1635 üzenetére
köszi az észrevételeket, kijavítottam
viszont tényleg nemtom, h mitől nem bírja nromálisan átadni a FILE* mutatót, szal inkább azt csináltam, h bezárom a fájlt a fv végén, majd a main-ben újra megnyitomés seekelek oda ahol a stream kezdődik
most másfajta hibába ütköztem, de először megpróbálom kisakkozni a helyét..
ALI_G: nem tudom, én nem mentem bele ennyire mélyen
innen vettem a chunk-infókat, sztem megtalálod benne ami neked kell
[link] -
emitter
őstag
ha egy függvényen belül megnyitok egy fájl, majd a handle-jét átadom a főproginak paraméterben, az miért nem működik? hibát ad.. ez itten:
class wavInfo{
public:
...
FILE *handle;
...
};
int loadWav(char* filename, wavInfo &wi){
...
handle = fopen(filename, ''r'');
...
wi.handle = handle;
...
}
main(){
...
wavInfo *wi;
wi = new wavInfo();
loadWav(argv[1], *wi); //ez okésan lefut
cout << ''\nFilepos: '' << ftell(wi->handle); //majd erre már szegmenshibát dob
...
}
------------
lehet, h egy fv visszatérésekor bezáródik a fájl? -
-
emitter
őstag
miért van az, hogy ez a kód wav-lejátszás közben folyamatosan szaggat??
------
bufsize=44100;
buf=(short*)malloc(bufsize*sizeof(short));
while(!feof(handle)){
i = fread(buf, 1, bufsize, handle);
if(i < 0){
printf(''\nHiba fajlolvasas kozben!\n'');
exit(1);
}
printf(''\ni=%d\n'',i);
if((err = snd_pcm_writei (playback_handle, buf, bufsize)) < 0) {
fprintf (stderr, ''\nWrite to audio interface failed (%s)\n'',
snd_strerror (err));
exit (1);
}
}
-------
az, csak nem lehet az oka, hogy snd_pcm_writei() előtt van egy fread meg 2 if...
szóval mitől
ha kell, a teljes kód [link] -
emitter
őstag
válasz
emitter #1599 üzenetére
van ez a fv:
/* Load a music file */
Mix_Music *myMix_LoadMUS(const char *file)
{
FILE *fp;
char *ext;
Uint8 magic[5], moremagic[9];
Mix_Music *music;
/* Figure out what kind of file this is */
fp = fopen(file, ''rb'');
if ( (fp == NULL) || !fread(magic, 4, 1, fp) ) {
if ( fp != NULL ) {
fclose(fp);
}
Mix_SetError(''Couldn't read from '%s''', file);
return(NULL);
}
if (!fread(moremagic, 8, 1, fp)) {
Mix_SetError(''Couldn't read from '%s''', file);
return(NULL);
}
magic[4] = '\0';
moremagic[8] = '\0';
fclose(fp);
/* Figure out the file extension, so we can determine the type */
ext = strrchr(file, '.');
if ( ext ) ++ext; /* skip the dot in the extension */
/* Allocate memory for the music structure */
music = (Mix_Music *)malloc(sizeof(Mix_Music));
if ( music == NULL ) {
Mix_SetError(''Out of memory'');
return(NULL);
}
music->error = 0;
#ifdef CMD_MUSIC
if ( music_cmd ) {
music->type = MUS_CMD;
music->data.cmd = MusicCMD_LoadSong(music_cmd, file);
if ( music->data.cmd == NULL ) {
music->error = 1;
}
} else
#endif
#ifdef WAV_MUSIC
/* WAVE files have the magic four bytes ''RIFF''
AIFF files have the magic 12 bytes ''FORM'' XXXX ''AIFF''
*/
if ( (ext && MIX_string_equals(ext, ''WAV'')) ||
((strcmp((char *)magic, ''RIFF'') == 0) && (strcmp((char *)(moremagic+4), ''WAVE'') == 0)) ||
(strcmp((char *)magic, ''FORM'') == 0) ) {
music->type = MUS_WAV;
music->data.wave = WAVStream_LoadSong(file, (char *)magic);
if ( music->data.wave == NULL ) {
Mix_SetError(''Unable to load WAV file'');
music->error = 1;
}
} else
#endif
#ifdef MID_MUSIC
/* MIDI files have the magic four bytes ''MThd'' */
if ( (ext && MIX_string_equals(ext, ''MID'')) ||
(ext && MIX_string_equals(ext, ''MIDI'')) ||
strcmp((char *)magic, ''MThd'') == 0 ||
( strcmp((char *)magic, ''RIFF'') == 0 &&
strcmp((char *)(moremagic+4), ''RMID'') == 0 ) ) {
music->type = MUS_MID;
#ifdef USE_NATIVE_MIDI
if ( native_midi_ok ) {
music->data.nativemidi = native_midi_loadsong((char *)file);
if ( music->data.nativemidi == NULL ) {
Mix_SetError(''%s'', native_midi_error());
music->error = 1;
}
} MIDI_ELSE
#endif
#ifdef USE_TIMIDITY_MIDI
if ( timidity_ok ) {
music->data.midi = Timidity_LoadSong((char *)file);
if ( music->data.midi == NULL ) {
Mix_SetError(''%s'', Timidity_Error());
music->error = 1;
}
} else {
Mix_SetError(''%s'', Timidity_Error());
music->error = 1;
}
#endif
} else
#endif
#ifdef OGG_MUSIC
/* Ogg Vorbis files have the magic four bytes ''OggS'' */
if ( (ext && MIX_string_equals(ext, ''OGG'')) ||
strcmp((char *)magic, ''OggS'') == 0 ) {
music->type = MUS_OGG;
music->data.ogg = OGG_new(file);
if ( music->data.ogg == NULL ) {
music->error = 1;
}
} else
#endif
#ifdef MP3_MUSIC
if ( (ext && MIX_string_equals(ext, ''MPG'')) ||
(ext && MIX_string_equals(ext, ''MP3'')) ||
(ext && MIX_string_equals(ext, ''MPEG'')) ||
magic[0]==0xFF && (magic[1]&0xF0)==0xF0) {
SMPEG_Info info;
music->type = MUS_MP3;
music->data.mp3 = SMPEG_new(file, &info, 0);
if(!info.has_audio){
Mix_SetError(''MPEG file does not have any audio stream.'');
music->error = 1;
}else{
SMPEG_actualSpec(music->data.mp3, &used_mixer);
}
} else
#endif
#if defined(MOD_MUSIC) || defined(LIBMIKMOD_MUSIC)
if ( 1 ) {
music->type = MUS_MOD;
music->data.module = MikMod_LoadSong((char *)file, 64);
if ( music->data.module == NULL ) {
Mix_SetError(''%s'', MikMod_strerror(MikMod_errno));
music->error = 1;
} else {
/* Stop implicit looping, fade out and other flags. */
music->data.module->extspd = 1;
music->data.module->panflag = 1;
music->data.module->wrap = 0;
music->data.module->loop = 0;
#if 0 /* Don't set fade out by default - unfortunately there's no real way
to query the status of the song or set trigger actions. Hum. */
music->data.module->fadeout = 1;
#endif
}
} else
#endif
{
Mix_SetError(''Unrecognized music format'');
music->error = 1;
}
if ( music->error ) {
free(music);
music = NULL;
}
return(music);
}
---------------
a végén halálozik el:
...
Mix_SetError(''Unrecognized music format'');
music->error = 1;
}
if ( music->error ) {
free(music);
music = NULL;
}
return(music);
}
szóval errort-t 1-re állítja, és ezért NULL-pointerrel tér vissza.. a kérdésem, hogy az #ifdef és #endif tagok mit csinálnak pontosan, kellenek ezek egyáltalán bele?
vagy van olyan elsőre szemet szúró dolog, ami miatt ez történik? -
emitter
őstag
válasz
Jester01 #1596 üzenetére
de akkor elvileg a nyers fordítatlan SDL-libraryban benne kéne legyen, nem? mint nyers szövegfájlban - pedig azt is átnéztem, és semmit nem találtam benne..
akkor ez így reménytelen?
írok a fejlesztőknek, h mi van már
egyébként nem tudom elképzelni, h mivel openszorsz, ne lenne meg valahol a fv forrása.. csakhogy eddig sehol nem találtam -
emitter
őstag
válasz
Jester01 #1594 üzenetére
kerestem, de nem nagyon találtam.. Krusaderrel végignéztem a /usr tartalmát fájlbéli kereséssel a fv nevére - semmi eredmény (kivéve az SDL_mixer.h extern-es sora)
amikor fordítom így, hogy:
gcc -o music_2 music_2.c -Wall -lncurses -lSDL_mixer
itt a ''-lSDL_mixer'' hova hivatkozik? Már csak ez az utolsó esély arra, hogy ebben van valahol a definíció, mert semelyik include nem húz be definíciós fájlt, másra meg nem tudok gondolni... -
emitter
őstag
vszeg azert mert extern..
az extern arra valo hogy megadod a fv interfeszet, es jelzed hogy ennek nem lesz implementacioja a forrasaid kozott. viszont a forrasodban ettol fuggetlenul tudod hasznalni.
és ez mit jelent az én esetemben? szóval van egy ilyen extern fv:
extern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUS(const char *file);
ezt hol definiálhatják? mert működik ez a fv, csak nem találom sehol a definícióját...
se includolt headerekben, máshol meg hol keressem?
tanácstalan vagyok.. -
-
emitter
őstag
válasz
Jester01 #1583 üzenetére
emitter@LAPTOP:~/Letoltesek/sdl-talk-1-examples$ gcc -o music music.c -Wall -lncurses -lSDL -lSDL_mixer -I/usr/include/SDL -I /usr/local/include/SDL/
music.c: In function 'main':
music.c:83: warning: passing argument 1 of 'Mix_PlayMusic' from incompatible pointer type
music.c: In function 'LoadMusic':
music.c:136: warning: assignment from incompatible pointer type
music.c: In function 'myMix_LoadMUS_RW':
music.c:168: error: invalid application of 'sizeof' to incomplete type 'Mix_Music'
music.c:168: warning: assignment from incompatible pointer type
emitter@LAPTOP:~/Letoltesek/sdl-talk-1-examples$
pedig leszedtem a csomag SDL-t, majd újraraktam forrásból a patchelt SDL-t, és forgattam volna a kódomat... [link] -
emitter
őstag
válasz
Jester01 #1580 üzenetére
nekem pedig nem jó
mind1, leszedtem libsdl-mixer1.2-dev csomagot, mindenhol beírtam egy struct-ot, elvileg jó kéne legyen, de nem:
(nem inklúdoltam a nemlétező SDL_mixer.h-t)
emitter@LAPTOP:~/Letoltesek/sdl-talk-1-examples$ gcc -o music music.c -Wall -lncurses -lSDL -lSDL_mixer -I/usr/include/SDL
music.c:24: error: syntax error before 'Mix_MusicType'
music.c:24: warning: no semicolon at end of struct or union
music.c:50: error: syntax error before 'fading'
music.c:50: warning: type defaults to 'int' in declaration of 'fading'
music.c:50: warning: data definition has no type or storage class
music.c:54: error: syntax error before '}' token
music.c: In function 'main':
music.c:72: warning: implicit declaration of function 'Mix_OpenAudio'
music.c:72: error: 'MIX_DEFAULT_FREQUENCY' undeclared (first use in this function)
music.c:72: error: (Each undeclared identifier is reported only once
music.c:72: error: for each function it appears in.)
music.c:73: error: 'MIX_DEFAULT_FORMAT' undeclared (first use in this function)
music.c:74: error: 'MIX_DEFAULT_CHANNELS' undeclared (first use in this function)
music.c:82: warning: implicit declaration of function 'Mix_PlayMusic'
music.c:85: warning: implicit declaration of function 'Mix_PlayingMusic'
music.c:90: warning: implicit declaration of function 'Mix_CloseAudio'
music.c: In function 'LoadMusic':
music.c:135: error: 'Mix_Music' undeclared (first use in this function)
music.c:135: error: syntax error before ')' token
music.c: In function 'myMix_LoadMUS_RW':
music.c:154: warning: implicit declaration of function 'Mix_SetError'
music.c:167: error: 'Mix_Music' undeclared (first use in this function)
music.c:167: error: syntax error before ')' token
emitter@LAPTOP:~/Letoltesek/sdl-talk-1-examples$
-----------
ha pedig inklúdolom a nemlétező headert, akkor csak ennyit ad:
emitter@LAPTOP:~/Letoltesek/sdl-talk-1-examples$ gcc -o music music.c -Wall -lncurses -lSDL -lSDL_mixer -I/usr/include/SDL
music.c: In function 'main':
music.c:82: warning: passing argument 1 of 'Mix_PlayMusic' from incompatible pointer type
music.c: In function 'LoadMusic':
music.c:135: warning: assignment from incompatible pointer type
music.c: In function 'myMix_LoadMUS_RW':
music.c:167: error: invalid application of 'sizeof' to incomplete type 'Mix_Music'
music.c:167: warning: assignment from incompatible pointer type
emitter@LAPTOP:~/Letoltesek/sdl-talk-1-examples$ -
emitter
őstag
válasz
Jester01 #1574 üzenetére
mod: frissítettem a kódomat a weblapomon..
asszem megtalűltam a headert: [link]
így inklúdoltam: #include ''music.h'' (azonos könyvtárban van a music.c-vel), de hibaüzit dob, hogy akadnak a music.h fv-ei más headerekével:
gcc -o music music.c -Wall -lncurses -lSDL -lSDL_mixer -I/usr/include/SDL
...
/usr/local/include/SDL/SDL_mixer.h:529: error: conflicting types for 'Mix_FadingMusic'
music.h:941: error: previous definition of 'Mix_FadingMusic' was here
/usr/local/include/SDL/SDL_mixer.h:530: error: conflicting types for 'Mix_FadingChannel'
/usr/include/SDL/SDL_mixer.h:532: error: previous declaration of 'Mix_FadingChannel' was here
/usr/local/include/SDL/SDL_mixer.h:567: error: conflicting types for 'Mix_GetChunk'
/usr/include/SDL/SDL_mixer.h:569: error: previous declaration of 'Mix_GetChunk' was here
....
stb
egy másik srác kipróbálta ugyanígy, neki nem akadtak, mi lehet a probléma?
----------------
megpróbáltam átrakni a Mix_Music definícióját a music.c kódomba:
struct Mix_Music {
Mix_MusicType type;
union {
#ifdef CMD_MUSIC
MusicCMD *cmd;
#endif
#ifdef WAV_MUSIC
WAVStream *wave;
#endif
#ifdef MOD_MUSIC
UNIMOD *module;
#endif
#ifdef MID_MUSIC
#ifdef USE_TIMIDITY_MIDI
MidiSong *midi;
#endif
#ifdef USE_NATIVE_MIDI
NativeMidiSong *nativemidi;
#endif
#endif
#ifdef OGG_MUSIC
OGG_music *ogg;
#endif
#ifdef MP3_MUSIC
SMPEG *mp3;
#endif
} data;
Mix_Fading fading;
int fade_step;
int fade_steps;
int error;
};
---
ha ezt a main elé berakom, így ahogy van, akkor jónak kéne lennie, nem? pedig nem jó, a fordító ugyanazt a hibát adja...
emitter@LAPTOP:~/Letoltesek/sdl-talk-1-examples$ gcc -o music music.c -Wall -lncurses -lSDL -lSDL_mixer -I/usr/include/SDL
music.c: In function 'myMix_LoadMUS_RW':
music.c:165: error: invalid application of 'sizeof' to incomplete type 'Mix_Music'
[Szerkesztve] -
emitter
őstag
válasz
emitter #1565 üzenetére
hát végülis a 3 music->error-t kikommenteztem
(jó kis favágó módszerrel), a
187: music = (Mix_Music *) malloc(sizeof(Mix_Music*));
sort pedig így átartam, most lefordul, csak hang nem jön...
megkérhetnék valakit, hogy próbálja meg linuxon lefordítani, megy-e neki? [link]
thx
(kell hozzá SDL-mixer, meg -dev-files, meg asszem smpeg-lib is) -
emitter
őstag
válasz
Jester01 #1564 üzenetére
hát azt meg honnan tudjam, h jók-e a headerek
egyébként igazad van, ez tényleg csak egy mutató, de a progimban is mindenhol csak ilyen mutató típusú változókat deklaráltam, szóval elvileg ezzel nem kéne porbléma legyen..
ha átírom a
187: music = (Mix_Music *) malloc(sizeof(Mix_Music));
sort
187: music = (Mix_Music *) malloc(sizeof(Mix_Music*));
-ra, akkor már nem ad hibát erre, persze a, másik 3 hiba még marad..
egyébként mit jelent az, h dereferncing pointer.. szóval a többi hibaüzi mi miatt lehet?
ja, és ha vissza akarnám szedni a patchelt SDL-mixer libet, visszaállítani a régi hivatalost, akkor mit kell csnálnom? csak simán csomagból felrakom a régit? -
emitter
őstag
Fordítási hibák, valszeg én vagyok a béla, de mi a rák van ezzel
emitter@LAPTOP:~/Letoltesek/sdl-talk-1-examples$ gcc -o mixer-music mixer-music.c -Wall -lncurses -lSDL -lSDL_mixer -I/usr/include/SDL
mixer-music.c: In function 'Mix_LoadMUS_RW2':
mixer-music.c:187: error: invalid application of 'sizeof' to incomplete type 'Mix_Music'
mixer-music.c:192: error: dereferencing pointer to incomplete type
mixer-music.c:280: error: dereferencing pointer to incomplete type
mixer-music.c:282: error: dereferencing pointer to incomplete type
a kérdéses sorok a kódomban:
187: music = (Mix_Music *) malloc(sizeof(Mix_Music));
192, 280, 282: music->error = 0;
---
megnéztem, a patchelt SDL-példakódban a MixMusic* típus így néz ki:
static Mix_Music * volatile music_playing = NULL;
ezalapján hol lehet a hiba?
köszi!
ui: mindez egy hivatalos SDL-példakódban volt..
[Szerkesztve] -
emitter
őstag
válasz
Jester01 #1559 üzenetére
no és én most mit csináljak ezzel?
music = (Mix_Music*) Mix_LoadMUS_RW(rw); // ---itt van a forditasi hiba---
ezt írtam, de ettől még éppúgy implicit deklarációra hivatkozik...
el tudnád magyarázni az utolsó link alapján, hogy a srácnak hogyan sikerült megoldani hasonló problémáját? sajna nekem nem világos a válaszokból ([link])
köszi -
emitter
őstag
válasz
Jester01 #1557 üzenetére
köszi!
egy újabb kérdés, ezt kapom fordításkor:
emitter@LAPTOP:~/Letoltesek/sdl-talk-1-examples$ gcc -Wall -lncurses -lSDL -lSDL_mixer -o mixer-demo mixer-demo.c
mixer-demo.c: In function 'LoadMusic':
mixer-demo.c:128: warning: implicit declaration of function 'Mix_LoadMUS_RW'
mixer-demo.c:128: warning: assignment makes pointer from integer without a cast
mixer-demo.c: [link]
ezt a kódrészletet, amivel pufferből mix_music-ot csinálok, itt találtam: [link]
a srácnak se működött valami miatt, de nem értettem, hogy mi is pontosan a megoldás, amit válaszoltak neki.. -
emitter
őstag
válasz
Jester01 #1551 üzenetére
ez alapján próbálkoztam, már működik a getch()
, csak akadtak egyéb problémák...
[link]
...
initscr();
cbreak();
do{
printw(''Pause - 'p' '');
printw(''\nResume - 'r' '');
printw(''\nStop - 's'\n'');
refresh();
do{
switch( c=getch() ){
case 'p' :
printf(''\nPaused\n'');
Mix_PauseMusic();
break;
case 's' :
printf(''\nStopped\n'');
Mix_HaltMusic();
exit(1);
break;
default :
break;
}
}
while(c!='r');
Mix_ResumeMusic();
}
while (Mix_PlayingMusic());
endwin();
...
szóval ez a kódom, de nagyon érdekes dolgokat csinál: ha 's'-t nyomok, akkor leállítja ugyan, kilép a progiból, csak:
- a promptot behúzza egy tabbal, és nem látom, amit beírok utána
- amit látatlanba írok parancsot, végrehajtja, de minden egyes kiírást eltol egy tabbal..
- ctrl+c-re sem lép ki ebből a hülyeségből, egy újabb tabbal odébbrakja a promptot
- csak exit-re lép ki a konzolból
ez mitől lehet???
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
- Építő/felújító topik
- Samsung Galaxy Z Fold7 - ezt vártuk, de…
- Tőzsde és gazdaság
- Call of Duty: Modern Warfare III (2023)
- Energiaital topic
- Kerékpárosok, bringások ide!
- sziku69: Fűzzük össze a szavakat :)
- Milyen okostelefont vegyek?
- Samsung Galaxy Watch8 - Classic - Ultra 2025
- Telekom mobilszolgáltatások
- További aktív témák...
- Bomba ár! Dell Precision 5530 - i7-8850H I 16GB I 512SSD I 15,6" FHD I P1000 I Cam I W11 I Gari!
- Azonnali készpénzes Apple Macbook Air felvásárlás személyesen / csomagküldéssel korrekt áron
- Extra olcsó! HP 230 Vezetéknélküli USB-s Billentyűzet
- Telefon felvásárlás!! Samsung Galaxy A20e/Samsung Galaxy A40/Samsung Galaxy A04s/Samsung Galaxy A03s
- Telefon felvásárlás!! Samsung Galaxy A13/Samsung Galaxy A33/Samsung Galaxy A53
Állásajánlatok
Cég: FOTC
Város: Budapest