 |

|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 05 04, 11:34. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Elektronika žaliems » integer overflow in expression
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
Puslapis 1 iš 2 Pereiti prie 1, 2 Toliau |
|
 |
integer overflow in expression |
Parašytas: 2015 10 04, 23:15 |
|
|
|
Tai va iškilo tokia problema bandžiau ją spręsti įvairai, tačiau greičiausiai kažko nemoku. Taigi bėda iškyla su AVR studio 6 rašant tokia eilutę:
Kodas: |
long X1,X2,X3,B3,B6,p;
unsigned long B4, B7;
tp[5]=2968;//(testavimui į masyva įsirašyta reikšmė
B6=tp[5]-4000;
X1=(b2*(B6*B6/4096))/2048;
X2=ac2*B6/2048;
X3=X1+X2;
[b]B3=9002*4;[/b] //bėda šioje eilutėje |
Ją sprendžiau įvairai tai rašiau
,tai
ir kaip sakant viskas bergždžiai. Jei dauginu is 2 ar 3 viskas ok, bet suketvertu niekas nesigauna. Ir visada gaunu integer overflow in expression pranešimą |
|
|
|
|
 |
 |
integer overflow in expression |
Parašytas: 2015 10 05, 01:50 |
|
|
|
(signed/unsigned) char - 1 byte
(signed/unsigned) short - 2 bytes
(signed/unsigned) int - 2 bytes
(signed/unsigned) long - 4 bytes
(signed/unsigned) long long - 8 bytes
float - 4 bytes (floating point)
double - alias to float
Patarimas naudoti tokius išsireiškimus vietoje int, long ir t.t. Kompiliatorius visada teisingai identifikuos jį, nebus tokių nesusipratimų.
int8_t - Signed Char
uint16_t - Unsigned Int
uint32_t - Unsigned Long
int64_t - Signed Long Long
O jei apie klaidą:
Kiek long gali talpinti? 2^16 bit jei signed, kurį ir naudoji. Kokia max reikšmė? Ogi +-32767.... o 4*9002 jau bus 36008... štai tau ir Overflow. |
|
|
|
|
 |
integer overflow in expression |
Parašytas: 2015 10 05, 04:51 |
|
|
|
Kažkas su AVR Studio negerai (gal laikas atnaujinti?) Su mano naudojamu kompiliatorium (avr8-gnu-toolchain-3.4.5.1522) abu šie variantai veikia be priekaištų:
Kodas: |
(long)9002*4
9002L*4 |
|
|
|
|
|
 |
integer overflow in expression |
Parašytas: 2015 10 05, 13:03 |
|
|
|
Saulius18 rašo: |
dėkui, labai geros info davėt |
Taigi viena bėda išsisprendė ir iškilo nauja, o naujoji tokia jei vietoje 9002 įrašau kintamąjį, kuriam ši reikšmė priskirta niekaip egaunu tinkamo atsakymo kaži kodel? |
|
|
|
|
 |
integer overflow in expression |
Parašytas: 2015 10 05, 14:14 |
|
|
|
Saulius18 rašo: |
Saulius18 rašo: |
dėkui, labai geros info davėt |
Taigi viena bėda išsisprendė ir iškilo nauja, o naujoji tokia jei vietoje 9002 įrašau kintamąjį, kuriam ši reikšmė priskirta niekaip egaunu tinkamo atsakymo kaži kodel? |
Gal vel blogai aprasei kintamaji? Be kodo cia nieks nieko nepasakys. |
|
|
|
|
 |
 |
integer overflow in expression |
Parašytas: 2015 10 05, 16:01 |
|
|
|
ok va kodas
Kodas: |
/*
* bmp180_attiny2313.c
*
* Created: 2015.10.01 19:09:15
* Author: Saulius Stasys + eXtreme Electronics i2c librarry
*/
#define F_CPU 8000000
#include <avr/io.h>
#include <math.h>
#include "i2csoft.h"
#include "i2csoft.c"
long tempsleg(char kal,char torp) //pries tai klaida buvo cia, vietoj long buvau irases short
{
char i;
int mas[24];
//kalibravimo bitų nuskaitymas ir įrašymas į masyvą
//read calibration bits and their write to array
if (kal==0)
{
for (i=170;i<192;i++) // skaitymas nuo 0xaa iki 0xbf, readig from 0xaa to 0xbf
{
SoftI2CInit();
SoftI2CStart();
SoftI2CWriteByte(0xee);
SoftI2CWriteByte(i);
SoftI2CStop();
SoftI2CStart();
SoftI2CWriteByte(0xef);
mas[i-170]|=SoftI2CReadByte(0);
SoftI2CStop();
}
}
//bitų konvertavimas į konstatas, bits conversion to constants
signed short ac1,ac2,ac3,b1,b2,mb,mc,md;
unsigned short ac4,ac5,ac6;
ac1=(mas[0]*256)+mas[1];
ac2=(mas[2]*256)+mas[3];
ac3=(mas[4]*256)+mas[5];
ac4=(mas[6]*256)+mas[7];
ac5=(mas[8]*256)+mas[9];
ac6=(mas[10]*256)+mas[11];
b1=(mas[12]*256)+mas[13];
b2=(mas[14]*256)+mas[15];
mb=(mas[16]*256)+mas[17]; //niekur nepasinaudos :D, not using :D
mc=(mas[18]*256)+mas[19];
md=(mas[20]*256)+mas[21];
long tp[8],ut,up;
if (torp==1)
{
//cia viskas ok
/*//temperatūros nuskaitymas, read temperature
SoftI2CStart();
SoftI2CWriteByte(0xee);
SoftI2CWriteByte(0xf4);
SoftI2CWriteByte(0x2e);
//_delay_loop_2(4.5);
SoftI2CStop();
SoftI2CStart();
SoftI2CWriteByte(0xee);
SoftI2CWriteByte(0xf6);
SoftI2CStop();
SoftI2CStart();
SoftI2CWriteByte(0xef);
tp[0]=SoftI2CReadByte(1);
tp[1]=SoftI2CReadByte(0);
SoftI2CStop();
ut=(tp[0]*256)+tp[1];
//realios temperaturos apskaičiavimas, calculate real temperature
long X1,X2,B5,T;
X1=(ut-ac6)*ac5/32768;
X2=mc*(long)2048/(X1+md);
B5=X1+X2;
T=(B5+8)/16; //tikroji temperatura nurodyta 0.1C tikslumu, real temperature scale 0.1C
tp[5]=B5;
tp[6]=T; */
}
else
{
//slėgio nuskaitymas, read pressure
SoftI2CStart();
SoftI2CWriteByte(0xee);
SoftI2CWriteByte(0xf4);
SoftI2CWriteByte(0xf4);
_delay_loop_2(25); //taupiam 4.5, stadartiniam 7.5, dideles rezoliucijos 13.5, ultra d.rez 25, for low power mode 4.5, standart 7.5, high resoliution 13.5, ultra h.res 25.
SoftI2CStop();
SoftI2CStart();
SoftI2CWriteByte(0xee);
SoftI2CWriteByte(0xf6);
SoftI2CStop();
SoftI2CStart();
SoftI2CWriteByte(0xef);
tp[2]=SoftI2CReadByte(1);
tp[3]=SoftI2CReadByte(1);
tp[4]=SoftI2CReadByte(0);
SoftI2CStop();
up=(tp[2]*256)+tp[3]+tp[4];
long X1,X2,X3,B3,B6,p;
unsigned long B4, B7;
tp[5]=2968; //testavimui irasyta masyvo reiksme
B6=tp[5]-4000;
X1=(b2*(B6*B6/4096))/2048;
X2=ac2*B6/2048;
X3=X1+X2; //iki cia viskas ok
B3=(long)ac1*4; // vietoj ac1 irasius 9002 viskas ok visa skaiciavimo formulė (ac1*4+X3+2)/4 šios eilutes rezultatas turetu gautis 9156
if (B3==36008)//rezultato tikrinimui
{
PORTB=255;
}
else
{
PORTB=10;
}
/* X1=ac3*B6/8192;
X2=(b1*(B6*B6/4096))/65536;
X3=((X1+X2)+2)/4;
B4=ac4*(unsigned long)(X3+32768)/32768;
B7=((unsigned long)up-B3)*50000;
if (B7<2147483648)
{
p=(B7*2)/B4;
}
else
{
p=(B7/B4)*2;
}
X1=(p/256)*(p/256);
X1=(X1*3038)/65536;
X2=(-7357*p)/65536;
p=p+(X1+X2+3791)/16;*/
tp[6]=B3; //taipogi testavimui
}
return tp[6];
}
int main(void)
{
DDRB=255;
char b=0;
long t;
while(1)
{
//PORTB=tempsleg(b,1);
// _delay_ms(200);
t=tempsleg(b,0);
b=1;
//TODO:: Please write your application code
}
} |
problemos su B3 apskaiciavimu |
|
|
|
|
 |
 |
integer overflow in expression |
Parašytas: 2015 10 05, 16:37 |
|
|
|
Saulius18 rašo: |
ok va kodas
Kodas: |
int mas[24];
...
signed short ac1,ac2,ac3,b1,b2,mb,mc,md;
...
ac1=(mas[0]*256)+mas[1];
...
long X1,X2,X3,B3,B6,p;
...
B3=(long)ac1*4;
|
|
Tavo mas[0] yra int tipo, kuris yra 2 baitu ilgio. Tu ji padaugini is 256, t.y. perstumi per 8 bitus, todel jis tampa 4 baitu ilgio. Taigi ac1 negali buti short tipo, nes rezultatas i tiek netelpa.
Pradziai sutvarkyk sita.
Paskui tu bandysi priskirti 4 baitu kintamaji perstumta per 2 bitus prie 4 baitu (long) kintamojo B3, kuris velgi - permazas. Uztektu 5 baitu, bet tokio nera, tad turesi naudot ilgesni.
O ir siaip tie dauginimai gal ir teisingai suprantami kompiliatoriaus, bet kodas dazniausiai zymiai lengviau skaitosi, kai darai bitu perstumimus. |
|
|
|
|
 |
 |
integer overflow in expression |
Parašytas: 2015 10 05, 17:58 |
|
|
|
nesigauna visus pakeiciu i long arba i long long vis tiek tas pats. O bitu perstumimo nemoku gal kazkas panasaus i tai?
nes jei taip, tas irgi nesigauna. |
|
|
|
|
 |
integer overflow in expression |
Parašytas: 2015 10 05, 18:07 |
|
|
|
Saulius18 rašo: |
nesigauna visus pakeiciu i long arba i long long vis tiek tas pats. O bitu perstumimo nemoku gal kazkas panasaus i tai?
nes jei taip, tas irgi nesigauna. |
su bitu perstumimu issiaiskinau:
Kodas: |
(mas[0]<<8)+mas[1]; |
|
|
|
|
|
 |
integer overflow in expression |
Parašytas: 2015 10 05, 18:17 |
|
|
|
Saulius18 rašo: |
Saulius18 rašo: |
nesigauna visus pakeiciu i long arba i long long vis tiek tas pats. O bitu perstumimo nemoku gal kazkas panasaus i tai?
nes jei taip, tas irgi nesigauna. |
su bitu perstumimu issiaiskinau:
Kodas: |
(mas[0]<<8)+mas[1]; |
|
Tai visu keisti tau nereikia. Reikia keisti tik tuos, kuriuos reikia
O ir siaip, kintamuosius apsirasyk paprogrames/f-jos virsuje, o ne kazkur viduryje. |
|
|
|
|
 |
integer overflow in expression |
Parašytas: 2015 10 05, 19:05 |
|
|
|
tai tuos iskelnot lengviausia, o tai kuriuos man redaguoti? bandziau prie kiekvieno atskirai ir prie visu
Kodas: |
long ir long long ir int64_t |
|
|
|
|
|
 |
integer overflow in expression |
Parašytas: 2015 10 05, 20:28 |
|
|
|
Saulius18 rašo: |
viskas su šia problema baigta |
Tik niekam nesakyk kaip issprendei, kad ateityje kas susidures su ta pacia problema vel kurtu nauja tema. |
|
|
|
|
 |
integer overflow in expression |
Parašytas: 2015 10 05, 20:45 |
|
|
|
Socrates rašo: |
Saulius18 rašo: |
viskas su šia problema baigta |
Tik niekam nesakyk kaip issprendei, kad ateityje kas susidures su ta pacia problema vel kurtu nauja tema. |
Butinai reiks sukurt  |
|
|
|
|
|
 |
Google paieška forume |
|
 |
Naujos temos forume |
|
 |
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
 |
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
 |
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
 |
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
 |
LEGO
Mänguköök,
mudelautod,
nukuvanker |
 |
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
 |
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
 |
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
 |
Football Training Kit
Football Training Equipment,
Football Skills,
Football Training |
|

|
 |