Hirdetés
- 3D nyomtatás
- Házimozi haladó szinten
- ZIDOO médialejátszók
- Milyen billentyűzetet vegyek?
- AMD Navi Radeon™ RX 7xxx sorozat
- NVIDIA GeForce RTX 4080 /4080S / 4090 (AD103 / 102)
- Egy tápkábel négy vezetékét elvágva is működik a GeForce RTX 5090
- Milyen hangkártyát vegyek?
- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
- Gaming notebook topik
Új hozzászólás Aktív témák
-
Jester01
veterán
Viszont ez minden elem elérésnél egy indirekt függvényhívás amit nem tud a fordító inline beágyazni. Bizonyos mennyiség fölött garantáltan sokkal lassabb lesz, mintha ténylegesen transzponáltad volna.
A másik, hogy a cache hatékonyságát nagyban befolyásolja a bejárás. Egy sorfolytonos bejárás sokkal gyorsabb lehet mint egy oszlopok szerinti. Az algoritmust ennek megfelelően választhattad meg, de ha a hívó egy függvénypointeresen transzponált mátrixot ad be, akkor amire a kód azt hiszi, hogy hatékony sorfolytonos az valójában nem az. Ugye bizonyos műveleteknél ezért éri meg ténylegesen transzponálni a mátrixot, a bejárás megváltoztatása helyett, még akkor is ha amúgy nincs függvénypointeres trükközés. Lásd még What every programmer should know about memory: "Through the simple transformation of the matrix we can achieve a 76.6% speed-up! The copy operation is more than made up. The 1000 non-sequential accesses really hurt. "
Virtuális mátrixokhoz viszont kétségkívül jó megoldás lehet.
-
válasz
EQMontoya #5198 üzenetére
Konkretan elkezdtem ezt irni, de aztan ugy gondoltam, hogy nem trollkodok ennyire bele a forumba
Ezzel annyi lehet a gond C-ben, hogy ha az eredeti matrixot megvaltoztatjak, miutan visszaadtad a fvptr-t, akkor esetleg problema lehet. Rendes funkcionalis stilusban ez az alapmegoldas egyebkent, es ott meg azzal sincs gond, hogy valaki kirantja alolad a szonyeget (ill. az eredeti erteket).
-
Jester01
veterán
válasz
dabadab #5196 üzenetére
Attól függ mi a feladat pontosan. Mert ha a transzponált mátrixot oda kell adni valami másik függvénynek az boldogtalan lesz ha nem transzponálod ténylegesen mert nem tudja, hogy fel kell cserélni a koordinátákat. Persze ha van valami társított flag ami mutatja és ezt minden tudja is kezelni, akkor jó megoldás.
A kérdésre válaszolva: végig kell iterálni az alsó vagy a felső hárömszögön és cserélgetni. Már ha nem kell új helyre másolni, mert akkor az egészen végig kell menni és felcserélve kiírni.
[ Szerkesztve ]
-
dabadab
titán
Igazából a ravaszság az, hogy nem is kell ténylegesen transzponálni a mátrixot.
Gondolom valami kétdimenziós tömböt alkalmaztál a mátrix tárolására, szóval a tomb [A]x,y elemet valahogy úgy kapod meg, hogy elem=matrix[x][y]. Ha a transzponált mátrix [AT]x,y elemére vagy kiváncsi, akkor egyszerűen ki kell olvasni az eredeti mátrix [A]y,x elemét, vagyis transposed_element=matrix[y][x];
Röviden: olvasáskor egyszerűen cseréld fel az x-et meg az y-t és máris megvan a transzponált mátrix -
fmx
aktív tag
Üdv!
Kezdő programozó vagyok és lenne nekem egy példám..
A példa így szól:
Ird meg a C nyelvű függvényt mátrix transzponálására(az oszlopok és a sorok helyet cserélnek).Ird meg a főprogramot,amely bemutatja a függvény működését.
Nos,a mátrix kiírása/beolvasása sikerült viszont a transzponálás már nem megy annyira.Van pár ötletem de azért meghallgatnák pár tapasztaltabb embert,hogy mit javasol.
Köszönöm -
zka67
őstag
Szia, itt az általam használt modul. A gpio.h-t cseréld le a PIC io moduljára, és a gpio funkciókat is írd át a megfelelőkre, értelemszerűen (Ez a program a 2.5-ös portot használja, természetesen ez szabadon választható). A temp_delay értékeket át kell számolnod, hogy a megfelelő időzítéseket megkapd.
Először olvasd ki az értket a chip-ből a temp_get()-tel, utána indítsd el a következő konverziót a temp_start_conv()-val, és a következő kiolvasásig várj 1mp-et. A program az alapértelmezett felbontást használja (12 bit), a konverzió ideje 750ms. Ezalatt csinálhatsz mást, sűrűbben kiolvasni nincs értelme és egyébként is hibás adatot kapnál.
Remélem így már boldogulni fogsz
#include "core/gpio/gpio.h"
void temp_delay(int delay) {
do { ; } while(--delay);
}
void DQ_LOW(void) {
gpioSetDir(2, 5, gpioDirection_Output);
gpioSetValue(2, 5, 0);
}
void DQ_HIGH(void) {
gpioSetValue(2, 5, 1);
gpioSetDir(2, 5, gpioDirection_Input);
}
uint32_t DQ(void) {
return gpioGetValue(2, 5);
}
void temp_reset(void) {
char presence = 1;
while (presence) {
DQ_LOW() ;
temp_delay(9055); // 503us
DQ_HIGH();
temp_delay(1260); // 70us
presence = DQ();
temp_delay(7740); // 430us
}
}
void temp_write_byte(uint8_t val) {
uint32_t i;
uint8_t temp;
for (i=8; i>0; i--) {
temp = val & 0x01;
DQ_LOW();
temp_delay(90); // 5us
if (temp) DQ_HIGH();
temp_delay(1134); // 63us
DQ_HIGH();
temp_delay(36); // 2us
val = val >> 1;
}
}
uint8_t temp_read_byte(void) {
uint32_t i;
uint8_t value = 0;
for (i=8; i>0; i--) {
value >>= 1;
DQ_LOW();
temp_delay(108); // 6us
DQ_HIGH();
temp_delay(72); // 4us
if (DQ()) value |= 0x80;
temp_delay(1134); // 63us
}
return(value);
}
void temp_start_conv(void) {
DQ_HIGH();
temp_reset();
temp_write_byte(0XCC); // skip rom
temp_write_byte(0X44); // start conversion
}
uint32_t temp_get(void) {
uint32_t tlv, thv;
temp_reset();
temp_write_byte(0XCC); // skip rom
temp_write_byte(0XBE); // read scratchpad
tlv = temp_read_byte();
thv = temp_read_byte();
DQ_HIGH();
return tlv | (thv << 8);
} -
don_peter
senior tag
Igazából nem azért linkeltem, hogy úgy ahogy van másold és használd
A lényeg benne van csak észre kell vedd..Ha a gyártó által megadott időzítéseket használod, akkor mennie kell, max az lehet a gond, hogy a késleltető függvényed nem jó mert a PIC nincs jól beállítva, de ez már egy másik topik..
-
fraba
aktív tag
válasz
don_peter #5187 üzenetére
Free sample-ként rendeltem még régebben valamelyik gyártótól vagy összesen 5 db-ot. aztán onnan maradt meg.
De ezt (#5188) zka67 én is megjegyzem..
Köszi!
A leírását tanulmányoztam, egy egész délután játszottam az időzítésekkel, meg mindennel. Átírtam mindent, ötször megnéztem, de nem akarja az igazságot.
Ez amit belinkeltél meg nekem sajnos nem jó, az MPLAB X egy rakás hibaüzenetet küld, hogy ez nem jó meg az nem jó. De ahogy elnézem, nem véletlen. "(CCS Compiler, Microchip C18 Compiler)".
Tudom, ajándék csónak ne nézd a lapát, de... Valami ötlet?[ Szerkesztve ]
-
zka67
őstag
válasz
don_peter #5187 üzenetére
Szia, én innen szoktam venni a szenzorokat:
IC DS18B20 TO-92 DALLAS Thermometer Temperature Sensor NEW GOOD QUALITY
-
don_peter
senior tag
Ezek olyan függvények amelyek nincsenek benne a fórosban.
Gondolom egy külső fájlban írta meg és azt nem publikálta.
Használd ezt a forrást: [link]
Egyébként a DS1820-nak van adatlapja ott részletesen leírja miképpen kell vele kommunikálni.
Honnan szereztél ilyen szenzort?
Pont most akarok én is egy olyan projektet elkezdeni amihez ilyen szenzor fog kelleni.[ Szerkesztve ]
-
fraba
aktív tag
Sziasztok!
MPLAB X IDE v2.30-ben fejlesztek egy programot pic16f688-ra. DS1820-al szeretnék hőmérsékletet mérni. A program C-ben íródik. Találtam egy ilyen, már más által megvalósított kapcsolást és programot [link], de olyan parancsot használ (Ow_Reset, Ow_Read, Ow_Write), amit a fejlesztőkörnyezet nem ismer. Gondolom includeolni kéne egy header file-t, de itt elakadtam... Tudna valaki segíteni? Maga az includeolás az menne, azzal semmi probléma nincs, csak hogy mit honnan kell letölteni, hova kellene bemásolni, meg ilyenek.
Előre is köszönöm!
-
axioma
veterán
válasz
DrojDtroll #5184 üzenetére
Azt gyanitanam latatlanban, hogy nem arra gondoltak, hogy a futasnal legyen ez ellenorizve es kiabaljon ha nem jo (vagy esetleg ettol fuggoen mas modszerrel csinald tovabb), hanem arra, hogy az algoritmus maga biztositsa (a felepitesevel), hogy ez alatt marad a felhasznalas (vagy nem hasznalsz dinamikusan foglalt valtozokat, vagy ha megis, azoknak a szamara van felso korlat mar maga az algo alapjan). Illetve van me'g amikor az a cel, hogy a tomoritest oldd meg (pl. 4 db iranyt jelzo info (fel/le/jobbra/balra) egy byte-ban, vagy 30 darab 0-120 kozti egesz lista vagy tomb helyett bithellyel abrazolva 16 byte-on). A kicsit konkretabb feladatbol kiderulhetne, hogy melyik (vszinu egyszeruen kodolhato de sok memoriat hasznalo) algoritmus kizarasa miatt tettek bele a feltetelt - es valoszinuleg mert ettol lett szep es otletet igenylo a feladat
)
[ Szerkesztve ]
-
don_peter
senior tag
Srácok ennek a BT chipnek a konfigurációs beállításához kellett a bitfordítós program: DPTP System - nRF8001 Bluetooth kapcsolat
Köszi még egyszer a segítséget. -
EQMontoya
veterán
válasz
DrojDtroll #5181 üzenetére
Ez a kérdés hogyan merült fel?
-
DrojDtroll
veterán
Code::block-ban hol lehet beállítani, hogy az adott program csak 32mb ramot hasznaljon???
-
dabadab
titán
válasz
EQMontoya #5176 üzenetére
Valami beágyazott rendszerről van szó, ami a PC-kkel ellentétben az OS-t meg a programokat meg egyebeket nem bootkor olvassa be a RAM-ba valami háttértárról, hanem egyrészt valószínűleg OS egyáltalán nincs, ami program meg fut, az fixen flash memóriában van, nem RAM-ban (ezekben a cuccokban egyébként tipikusasn több a flash, mint a RAM, tehát ha valamit át lehet rakni RAM-ból flashbe, az áltlában jó dolog), márpedig egy const tömb az a program része.
-
jattila48
aktív tag
válasz
don_peter #5162 üzenetére
Hirtelen ez jutott eszembe, de biztos van gyorsabb módszer is:
unsigned char reverse_bits(unsigned char x)
{
unsigned char y=0;
y=y | ((x & 0x80) >> 7);
y=y | ((x & 0x40) >> 5);
y=y | ((x & 0x20) >> 3);
y=y | ((x & 0x10) >> 1);
y=y | ((x & 0x8) << 1);
y=y | ((x & 0x4) << 3);
y=y | ((x & 0x2) << 5);
y=y | ((x & 0x1) << 7);return y;
} -
don_peter
senior tag
-
EQMontoya
veterán
válasz
don_peter #5166 üzenetére
Hát józan paraszti ésszel nézve is 256byte-ot fogyaszt a lookup table, valamit egy indexelést hajtasz végre (ami ugye gyakorlatilag egy összeadás - tömb kezdetének címe+index).
Ez még egy kenyérpirítón is gyors lesz.Működés: a tömbben minden indexen az adott byte megfordítottja van, csak nyilván hexában van leírva.
Tehát pl.
tömb[1] = 0b00000001 megfordítása = 0b10000000 = 0x80.
tömb[17] = 0b00010001 megfordítása = 0b10001000 = 0x88.[ Szerkesztve ]
-
don_peter
senior tag
Kedves kollégák,
Egy olyan algoritmust kérnék tőletek amely egy 8bit-es vagy is 1 byte-ot fordít meg.
Pl: ből - re
00000011 - 11000000
A lényeg, hogy a lehető legkevesebb erőforrást igényeljen a bitművelet.
Egy olyan rutin kellene ami nagyon gyorsan és pontosan illetve rugalmasan dolgozik mert nagyon sok különböző adatot kell felcserélni..
(Azért nem én álltam neki megírni a rutint, mert, itt kevés az, hogy jól működik, itt sokat számít, hogy a lehető leggyorsabb és legkevesebb erőforrást igényelve cserélje fel a bitsorozatot.)
Előre is köszi... (egyébként egy makró vagy struktúra is jó lehet, ha az gyorsabb) -
axioma
veterán
válasz
DrojDtroll #5159 üzenetére
Te kell karban tarts egy vektort, amit veremnek hasznalsz, vagy egy valtozot ahol visszafele lepeskor is adminisztralod a valtozast, vagy lehet akar minden elorefele lepesnel megszamolni...
Az algobol eleve kiesik egy info, eleg az a-kat szamolni, mert (ha jol vettem ki) x=y+z igy b kovetkezik, sot a koztes lepeseknel is tudod, mert egy index ugyis kell hogy hol tartasz a veremben, az pont jelzi az aktualis hosszt.
De ezt en nem feltetlen igy csinalnam... ha a kerdes algoritmikus es nem programozastechnikai. Eloszor is kevesebb lepes, ha a run-length kodolas alapjan me'sz (minden lepesben nem 1 db valamelyik karaktert teszel le, hanem 1-tol az adott betubol visszalevoig barmennyit a betuket valtogatva, a legelejen megengedheto de cask ott a 0 db).
Masreszt ez az n alatt a k tipikus esete (x alatt az y), es mivel iszonyat gyorsan nonek ezek a szamok, igy ha ki kell iratni, akar arra is lehet tamaszkodni, hogy bele fog ferni egy nagyobbacska int-be a bitenkenti abrazolassal... az int-ben meg tudod szamolni - persze csak ciklusban de a stringnel joval gyorsabban - a bitek szamat, es csak ami jo azt konvertalod a-b-re.)
Valamelyik pszeudot osszedobhatom, ha gondolod, de mindet inkabb nem. -
dabadab
titán
válasz
don_peter #5153 üzenetére
"Kérhetnék tőled egy kis példát miképpen oldanád meg ezt a 2db struct-ot?"
struct a
{
int foo;
int bar[8];
};
struct b
{
struct a x;
struct a y;
};
int main(void)
{
struct b var = SETUP_MESSAGES_CONTENT;
printf("%02x\n",var.x.bar[1]);
return 0;
}(Ez 06-ot fog kiirni.)
[ Szerkesztve ]
-
don_peter
senior tag
Köszönöm srácok a segítséget.
Végül így oldottam meg:const struct setup_t {
char dummy;
char command[32];
} valami[] = SETUP_MESSAGES_CONTENT; -
don_peter
senior tag
válasz
EQMontoya #5152 üzenetére
Tulajdonképpen egy program generálja le ezt a definíciót, amellyel aztán egy chip felkonfigurálását lehet megoldani.
Az adatszerkezetet eddig nem önmagában, hanem lebontva használtam fel, de szeretném kicsit felgyorsítani a tesztelést, így gondoltam a legenerált definíciót felhasználva gyorsítanám meg a dolgot..Ebből a definícióból csak a hosszabb sorok az értékes adatok, ezeket az adatsorokat egymás után kell elküldenem így a külön álló 0x00-ák nem lehetnek közöttük..
[ Szerkesztve ]
-
don_peter
senior tag
Srácok, elmagyarázná ezt a definíciót vagy makrót valaki, hogy kell értelmezni és hogy tudom az adatokat kinyerni belőle?
#define SETUP_MESSAGES_CONTENT {\
{0x00,\
{\
0x07,0x06,0x00,0x00,0x02,0x02,0x42,0x07,\
},\
},\
{0x00,\
{\
0x06,0x06,0xf0,0x00,0x02,0x49,0x6c,\
},\
},\
}
Nem láttam még ilyet és nem is tudom pontosan miképpen lehet felhasználni..
Előre is köszi...[ Szerkesztve ]
-
Barras
csendes tag
Segítséget kérnék az alábbiban:
#include <stdio.h>
#include <stdlib.h> /* exit (-1) itt definiálva*/int main()
{
int a, b, c; /* Változók definiálása*/
printf ( "Kérek két számot:");/*kérés megjelenítése*/
if (scanf("%d,%d",&a,&b)!=2); /*input-billetyűzetről, két vesszővel elválasztott egészszám*/
{
printf ("Hibás adatbevitel!\n"); /* hibás input esetén kiírás, utána kilépés*/
exit(-1);
}
c=a+b;
printf ("Két szám összege: %d + %d = %d\n", a, b, c); /*eredmény kiíratása*/
}Miért nem fut le helyesen a következő?
-Feladat: Billetyűzetről beolvas két egész számot,majd megjeleníti az összeget. Hibás input esetén kiírás
-Jelenség: Elindul,helyes adatbevitel után is hiba kiírás, s nem az összeg megjelenítése, s kilép. :S[ Szerkesztve ]
-
válasz
DrojDtroll #5144 üzenetére
Egy rekurziv megoldas lehet, pszeudokodban:
szavak_listaja = ures_lista;
fuggveny generalj_szot(szotoredek, rendelkezesre_allo_a, rendelkezesre_allo_b) {
ha szotoredek hossza = x akkor add hozza a szavak_listaja-hoz szotoredeket;
egyebkent
{
ha rendelkezesre_allo_a > 0 akkor generalj_szot(szotoredek+"a", rendelkezesre_allo_a-1, rendelkezesre_allo_b);
ha rendelkezesre_allo_b > 0 akkor generalj_szot(szotoredek+"b", rendelkezesre_allo_a, rendelkezesre_allo_b-1);
}
}Ezt at lehet alakitani rekurzio nelkulire, ha ugy tartja kedved.
-
DrojDtroll
veterán
Újabb problémán van.
Elő kellene állítanom az összes x hosszúságú stringet amelyben pontosan y darab 'a' és z darav 'b' karakter van.
Sajnos nem tudom ezt csak megoldani úgy hogy az 'a' és 'b' karakterekből előállítom az összes x hosszú stringet, és ezekből kiszűröm azokat amelyek kellenek. Valami erőforrás-hatékonyabb megoldás van a problémámra?
-
EQMontoya
veterán
válasz
DrojDtroll #5141 üzenetére
FILE **fin;
vs.
fin=fopen("pakol.be", "r+");Túltoltad kicsit a csillagot.
A változókat típus szerint érdemesebb lenne külön sorba deklarálni, ez így nagyon takony.
Szerk:
int** ladak
vs.
for(i=0;i<ladak_szama;i++){
if(ladak(i)>max && ladak(i)!=jel){
max=ladak(i);
maxindex=i;
}
}Itt is egydimenziósként használod a **-ot.
Szerintem némileg fogalmi zavarban vagy a pointerekkel, azt érdemes lenne tisztázni, mielőtt nekiállsz őket így használni.
[ Szerkesztve ]
-
DrojDtroll
veterán
-
axioma
veterán
válasz
DrojDtroll #5135 üzenetére
A temp azert nem nullazodik, mert a j ciklusvaltozo ellenere a magban a temp[i]-be irod a 0-t.
Innen meg ertheto a mukodes (az elozo szemet ottmarad, a rovidebb inputra raragad az elozo vege).[ Szerkesztve ]
-
DrojDtroll
veterán
válasz
EQMontoya #5136 üzenetére
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define szakmai 0
#define kozossegi 1
#define piaci 2
#define blog 3
FILE *sajat_id;
FILE *log_file;
FILE *html_out;
#define N 500
int main(){
char temp[N], t_str[4][100];
int j, i, t[4], szamlalo;
sajat_id=fopen("drojdtroll.html", "r+");
do{
fscanf(sajat_id, "%s\n", &temp);
if(strcmp(temp, "<p><small><b>szakmai</b></small></p>\0")==0){
fscanf(sajat_id, "%s\n", &t_str[szakmai]);
}
if(strcmp(temp, "<p><small><b>közösségi</b></small></p>")==0){
fscanf(sajat_id, "%s\n", &t_str[kozossegi]);
}
if(strcmp(temp, "<p><small><b>piaci</b></small></p>")==0){
fscanf(sajat_id, "%s\n", &t_str[piaci]);
}
if(strcmp(temp, "<p><small><b>blogok,")==0){
fscanf(sajat_id, "%s\n", &temp);
fscanf(sajat_id, "%s\n", &t_str[blog]);
}
}while(!feof(sajat_id));
fclose(sajat_id);
for(i=0;i<4;i++){
printf("%s ", t_str[i]);
for(j=0;j<N;j++){
temp[i]='\0';
}
szamlalo=0;
for(j=0;j<strlen(t_str[i]);j++){
if(isdigit(t_str[i][j])&& !isalpha(t_str[i][j])){
temp[szamlalo]=t_str[i][j];
szamlalo++;
}
}
printf("%s ", temp);
t[i]=atoi(temp);
printf("%d\n", t[i]);
}
return 0;
}Előre is köszönöm
-
EQMontoya
veterán
válasz
DrojDtroll #5135 üzenetére
Rakd be akkor az egész kódot, aztán átnézem.
-
DrojDtroll
veterán
válasz
EQMontoya #5134 üzenetére
csak egy részletet másoltam be, a string le van nullázva, a for megkezdése előtt.
A !isalpha()-t azért tettem bele, mert sima isdigittel nem ment.
for(i=0;i<4;i++){
printf("%s ", t_str[i]);
for(j=0;j<N;j++){
temp[i]='\0';
}
szamlalo=0;
for(j=0;j<strlen(t_str[i]);j++){
if(isdigit(t_str[i][j])&& !isalpha(t_str[i][j])){
temp[szamlalo]=t_str[i][j];
szamlalo++;
}
}
printf("%s ", temp);
t[i]=atoi(temp);
printf("%d\n", t[i]);
} -
EQMontoya
veterán
válasz
DrojDtroll #5133 üzenetére
Nullterminálni ki fogja a stringet?
Btw a !isalpha(..) mire kell? Ha az isdigit() teljesül, akkor számjegy és kész. -
DrojDtroll
veterán
Van egy kis stringből számmá alakítós problémám.
bemenet(t_str[]-ben tárolva):
<p>464</p>
<p>79</p>
<p>0</p>
<p>62</p>kimenet:
464
794
9
62A középső két sor hibás.
A kódrészlet amivel mindezt próbálom megoldani:
szamlalo=0;
for(j=0;j<strlen(t_str[i]);j++){
if(isdigit(t_str[i][j])&& !isalpha(t_str[i][j])){
temp[szamlalo]=t_str[i][j];
szamlalo++;
}
}
printf("%s ", temp);Mi lehet a gond?
-
Jester01
veterán
válasz
DrojDtroll #5130 üzenetére
Szerintem már ő is tudja
-
válasz
Pttypang #5123 üzenetére
Gyakorlaton atengedtek, par aprobb hibam volt, pl a kiiratasnal a strukturabol nem tudtam kiszedni az adatot, hanem a memoriacimet irattam ki..
printf("Fapapucsbol ennyi van: %d", &fapapucs->db");
Ez volt az egyetlen verzio, amit elengedett a fordito, de igy meg a memoriacimet irja ki. -
EQMontoya
veterán
válasz
peter9228 #5127 üzenetére
No offense, mert gyanítom, hogy nem a Te ötleted, de honnan van ez az elmés standard, hogy magyar függvényneveket használjatok?
A mennyiségi problémára (és performanciára is jótékony hatással - jelen esetben nyilván csak teoretikusan):
Ne inteket olvass be, hanem sorokat (char*), majd írj egy függvényt, ami azokat parseolja - függvényparaméter egy int*, és azt szépen feltölti, return value pedig, hogy mennyi intet sikerült beolvasni.Ha ez bármelyik sorban nem egyezik az elvárttal, vagy az elvártnál kevesebb sort sikerült beolvasni, akkor hiba történt.
[ Szerkesztve ]
-
peter9228
aktív tag
Hoppá, tényleg, itt nem úgy van. Bemásolom az enyémet inkább: [link]
A lényeg, hogy ez tökéletesen működik, ha a fájlban nincs hiba. Most nézem, nem száll el akkor sem ha valami gond van. Viszont azt akarom elérni, hogy ha a nem egyezik meg a magassag és a szelesseg az adatokkal, akkor írjon ki valami hibaüzenetet. (Tehát pl. az elején 10x10-es van, de az adat 100x100-as, vagy fordítva)
Szerk.: Hiányzik egy ; abból amit bemásoltam és van pár fölösleges változó, ezt nézzétek el.
[ Szerkesztve ]
-
peter9228
aktív tag
Sziasztok!
Van egy ehhez hasonló programrészletem: [link] (mint az első válasz)
A hibakezelést szeretném megcsinálni, tehát ha mondjuk az első két sorból kisebb/nagyobb méretű tömb jön ki mint amennyi adat van, ne szálljon el a program. Szerintetek hogyan lehetne ezt megvalósítani? -
Igen, koszi, a zarojelezesnel rontottam el, mert en a masik jelzest hasznaltam.
Valamiert ugy gondoltam ,hogy az if a te megoldasod szerint csak akkor engedi tovabb igen-el, ha mindegyik feltetel teljesul.
De akkor ezek szerint nem(#5119) emvy
Valahonnan erre emlekeztem, de ezt is elfogadhatta volna, ha rendesen zarojelezek, nem?
Mert ez lenne a logikai vagy
De mar lehet, hogy belezavarodtam ,es azt se tudom, hogy hogyan allapitjuk meg harom oldalrol, hogy alkothatnak-e haromszogetSzerintem utobbi zavart be picit
[ Szerkesztve ]
-
Az indexelest nem vettem eszre, akkor a nem lefoglalt memoriateruletrol gondolom behalaszott valamit.
Pointereket leszedtem, atirtam azokat, amiket emlitettel, de meg igy se irja ki, ha nem lehet osszerakni az oldalakbol haromszoget.Azt is feldobta csoporttarsam, hogy hasznaljam az stdbool.h libet, de azzal nemhiszem ,hogy elorebb lennek, nem valtoztatna rajta.
-
válasz
Pttypang #5114 üzenetére
- a 'kerulet' valtozot inicializalni kene (0-ra)
- a tomboket (es kb. mindent C-ben) 0-tol kezdodoen indexalunk, tehat az elso elem indexe 0, az n. elem indexe n-1, tehat a lehet_e_haromszog-ben az indexeket csokkentsd eggyel
- if (lehetvagynem = 1)
nagyon tipikus C/C++ hiba: a '=' operator ERTEKADAS, nem pedig egyenloseg-ellenorzes. Az ertekadas eredmenye az ertek. C-ben az if utan kovetkezhet szam is, nem csak boolean ertek (ha nem nulla, akkor igaznak szamit), tehat
if (a = 5) {
// ez itt mindig vegrehajtodik, mert erteket adtal a-nak, es az nem nulla
}Szoval if (lehetvagynem == 1) a helyes.
Te meg az elejen vagy, szoval ha lehet, szokd meg, hogy ugy tesztelunk egyenloseget, hogy bal oldalon van a konstans. Ergo:
if (1 == lehetvagynem) { }
.. ugyanis ha veletlenul elgepeled, akkor szolni fog a fordito.
[ Szerkesztve ]
-
válasz
Pttypang #5112 üzenetére
Erre is jo, de alapvetoen ez nagyon szuk resze a pointerek felhasznalasi modjanak. Azt gondold vegig, hogy imperativ programozasi nyelvekben (pl. C) megkulonboztetunk ket dolgot:
- ertek
- identitasTehat ha van ket valtozonk:
int a = 5;
int b = 5;.. akkor az ertekuk megegyezik, az identitasuk nem. A pointer arra jo, hogy ne erteket kezelj, hanem identitast. Ha atadom egy fuggvenynek a 'b' valtozo erteket, akkor az 5-ost adom at. Az eredeti b-vel (az identitassal) nem tud a hivott fuggveny semmit sem kezdeni, hiszen arrol nem tud, o csak az erteket (5) latja. Ha a b-re mutato pointert adom at (&b), akkor a hivott fuggveny az identitasrol tud, meg tudja valtoztatni b erteket, ha akarja.
Kepzelj el pl. egy fuggvenyt, ami kicsereli ket valtozo erteket. Ezt nem lehet megcsinalni csak ertekek atadasaval -- a 'csere' fuggveny bemenete ket _identitas_, hiszen ertekeket nem lehet megcserelni, azok ugyanugy ertekek maradnanak.
Funkcionalis nyelvekben (pl. Lisp, ML-leszarmazottak) nincs szukseg ilyesmire, mert ott csak ertekek vannak, identitas nincs. (Illetve van, csak sokkal jobban kezbentartott modon kezeljuk.)
[ Szerkesztve ]
-
Szóval ez kb arra jo, hogy atadhassak tomboket, a fuggveny pedig ha a parametereknel megadom int *-kent a tombot, akkor nem is kell semmi mast tennem, ezzel at is van adva a tomb es vegezhetek a fuggvennyel muveleteket rajta ugy, hogy nem kell foglalkoznom a visszaadással, mert a memoriacimen talalhato adatokkal dolgozik? Szoval nagyjabol ertem, de megis fura, hogy erre kulon kell valamit alkalmazni..
pl:
#include <stdio.h>
int darab (int * tomb, int meret);
int main()
{
int meret;
printf("Kerem az elemek szamat\n");
scanf("%d",&meret);
int elemek[meret];
printf("A 10-nel nagyobb elemek szama:%d",darab(elemek,meret));
return 0;
}
int darab (int * tomb, int meret)
{
int i;
int tobbmint=0;
for(i=0;i<meret;i++)
{
if(tomb[i]>10)
{
tobbmint+=1;
}
}
return tobbmint;
}[kihagytam az adatbevitel tobbi reszet, nem akartam megirni az egeszet a scanf-el, csak osszedobtam gyorsan, hogy lassam a dolgot.]
-
válasz
Pttypang #5110 üzenetére
Vegulis ezen kivul nincs tul sok dolog. Par aprosag:
- az operatorok probalnak okosak lenni, ezert ha pl. inkrementalsz egy pointert (ami ugye egy sima elojel nelkuli egesz szam) akkor az nem feltetlen egyet ugrik, hanem annyit, amekkora annak a tipusnak a merete, amire mutat. Tehat pl. egy 64 bites double-ra mutato pointer egy 32 bites architekturan 8 bajttal novekszik, ha inkrementalod.
double ertek = 5;
double * a = &ertek;
printf("%p\n", a);
a++;
printf("%p", a);>> 09FFB28
>> 09FFB30
Ketto kulonbsege: 8- a tomb az nem mas, mint a tomb kezdetere mutato pointer
.. most jo lenne, ha konkret dolgokat kerdeznel
-
válasz
Pttypang #5105 üzenetére
Van a neten csomofele leiras, erdemes rakeresni, de probaljuk meg itt is.
Ugyebar C-ben (es mas imperativ prog. nyelvekben is) vannak valtozoink, vagy nevezzuk oket inkabb ertekeknek, mert az tokmindegy, hogy valtoznak-e vagy sem. A forditonak megprobaljuk megmondani, hogy milyen tipusu az az ertek, amit letrehozunk. (A tovabbiakban tegyuk fel, hogy sima 32 bites arhichitekturan vagyunk). Pl.:
double a = 1;
Egy valtozorol mindig ket dolgot tudunk: mekkora helyen fer el (hany bitnyi hosszu), es hogyan ertelmezzuk. Azt, hogy hogyan/minek ertelmezzuk, szoktak tipusnak is nevezni.
Most 'a'-rol a kovetkezoket tudjuk:
- 64 bitnyi informacionk van
- ezt egy elojellel rendelkezo lebegopontos szamkent ertelmezzukHa van egy ilyenunk:
double * a;
.. akkor errol az tudjuk, hogy
- 32 bitnyi informacionk van
- ez egy egesz szam, es ugy ertelmezzuk, mint egy memoriacimet. A memoriacimen pedig egy 64 bit hosszu lebegopontos szamot talalunk.Tehat a pointer egy jellemzoen 32 vagy 64 bitnyi informaciot tartalmazo szam. A memoria szepen be van szamozva 0-tol 2^32 vagy 2^64-ig. Ha ahhoz a memoriarekeszhez mesz, aminek a szama megegyezik a pointer ertekevel, akkor ott egy olyan erteket talalsz, aminek a tipusa a pointer tipusaban jelezve is van.
A pointert a * jelzi altalaban. Ha van pl. egy
double ** a;akkor az a kovetkezo jelenti, analog modon:
- van egy 32 bites ertekunk
- ez egy egesz szam, es ugy ertelmezzuk, mint egy memoriacimet. A memoriacimen pedig egy 32 bit hosszu egesz szamot talalunk, amit ugy ertelmezunk, mint egy 32 bites erteket, amit ugy ertelmezzunk, mint egy memoriacimet. A memoriacimen pedig egy 64 bit hosszu lebegopontos szamot talalunk.Ez idaig vilagos?
(Tobbieknek: szandekosan vagyok pontatlan az int, double, etc. meretevel kapcsolatban.)
-
bladegery
senior tag
Ennel szajbaragosabban nem hiszem hogy el lehet mondani.
Magyarul.Szerintem ertheto pelda:
#include <stdio.h>
void csere(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int x = 3, y = 4;
printf("A fuggveny elott: x = %d, y = %d\n", x, y);
csere(&x,&y);
printf("A fuggveny utan: x = %d, y = %d\n", x, y);
return 0;
}[ Szerkesztve ]
-
Igen, az angollal elevickelek.
Ott tartok, hogy az eloadas folian le van irva, hogy mi is ez pontosan, de ezzel nem igazan vagyok elorebb, mert nem ertem, hogy miert jo ez. Marmint mire hasznalhato, meg pontosan hogyan.. Szoval a gyakorlati alkalmazasat valamiert nem latom at.
A pointereken kivul a tombok fuggvenyeknek parameterkent valo atadasa sincs meg, de szerintem erre megoldast talalok majd valamelyik eloadas folian.
A strukturakkal egyelore meg nem foglalkoztam, eloszor ezeket szeretnem megerteni, megtanulni a hasznalatukat normalisan.
-
Körbenéztem a topic leírásában, de nem igazán találtam azt, amit keresek.
Pontosan egy laikus számára érthetően leírva kerestem volna a pointerek hasznalatarol valamit, illetve magyarazatot hozzá.. Valaki ebben tudna esetleg segiteni?
-
CPT.Pirk
Jómunkásember
válasz
buherton #5101 üzenetére
Teljesítmény mérő lesz, de egyébként csak annyi, hogy hőkompenzált az AD rész és nem neked kell a számításokat megcsinálni.
Nem bízok benne annyira, mert ezeket a funkciókat már megvalósítottuk nuvotonban. Nekünk igazából a bemeneti szűréssel és az áram felharmonikusokkal volt bajunk, mikor a mérendő áramjel olyan szőrös volt a szkópon, mint a jeti talpa.- no meg nem volt mihez viszonyítani a mérésünket, így a pontosság kérdése függőben maradt.
[ Szerkesztve ]
-
válasz
CPT.Pirk #5100 üzenetére
Hóhó ez nagyon spéci cucc. Akkumulátor töltő vagy mi lesz belőle?
Most nekem is lenne egy kérdés. Nem igazán C viszont ha már felmerült az ARM, akkor megkérdezem.
Context switcher-t írok, de van két probléma, amivel nem tudok dűlőre jutni:
1. PendSV-ben történik a váltás, ahol értelemszerűen az MSP-t használom. Igen ám, de a stack pointer minden egyes meghíváskor 0x20-val csökken az értéke. Miért csinálja ezt?2. Így térek vissza a PendSV-ből:
volatile uint32_t LR_reg;
LR_reg = 0xFFFFFFFD;
__asm volatile ("BX %0" : "=r" (LR_reg));
Ennek ellnére még mindig privileged módban fut a cucc. Ha ez előtt beállítom direktbe a CONTROL regisztert, akkor user-ben fog futni, de nem erre találták ki az EXEC_RETURN-t?
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!