- Szevam: „Rendszerleállás” – egy AI képzeletbeli halál utáni élménye
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Argos: Szeretem az ecetfát
- sziku69: Fűzzük össze a szavakat :)
- Luck Dragon: Asszociációs játék. :)
- sziku69: Szólánc.
- NASsoljunk: ZyXEL NSA-310 és az FFP
- Magga: PLEX: multimédia az egész lakásban
- eBay-es kütyük kis pénzért
- Elektromos rásegítésű kerékpárok
Új hozzászólás Aktív témák
-
kovisoft
őstag
válasz
buherton #6372 üzenetére
Az általad korábban linkelt szövegrészben is ez van:
"The result of the postfix ++ operator is the value of the operand. After the result is obtained, the value of the operand is incremented."
Nyilván a -- operátorra ugyanez igaz. Azaz teljesen egyértelmű a dolog: először kiolvassa num értékét (ezt fogja átadni a printf-nek), és csak ezután fogja csökkenteni num-ot. Ezért először 6-ot fog kiírni.
-
kovisoft
őstag
-
pmonitor
aktív tag
válasz
buherton #6296 üzenetére
B. W. Kernighan - D. M. Ritchie: A C programozási nyelv című C alapkönyvben írják:
A C-ben is használhatjuk a sokat szidott goto utasítást, ugrathatunk címkékre. Elméletileg a goto-ra soha sincs szükség, és gyakorlatilag majdnem mindig egyszerűen programozhatunk nélküle is. Ebben a könyvben nem használtunk goto-t. Mindazonáltal bemutatunk néhány olyan esetet, ahol a goto-knak meg lehet a maguk helye. A leggyakoribb eset, amikor a feldolgozást valamilyen mélyen skatulyázott szerkezet belsejében akarjuk abbahagyni oly módon, hogy egyszerre két, egymásba ágyazott ciklusból lépünk ki.
-
pmonitor
aktív tag
válasz
buherton #6293 üzenetére
Ki mondta, hogy tömegesen kell a goto-t használni?
Te is tömegesen használtad a kódodban. De pl. amit jattila48 linkelt, ott is tömegével használják. Goto hegyek, hová legyek?
Azok a nevek C-ben dolgoztak? ... csak annyi maradt meg hogy BASIC, meg Pascal?!
Személyesen László Józsefet idéztem, aki ezt írta:
A goto utasítást a Pascal-ban nem használjuk, mert ugye programozók vagyunk.Egyenesen azt mondta, hogy aki Gotot használ, az nem programozó(mondjuk nekem mondhatja, mert én tényleg nem vagyok az, tehát én használhatnék goto-t
). Igaz, hogy Pascal-ra mondta, de gyakorlatilag a goto minden nyelvben ugyanazt csinálja(már amelyikben létezik, ugye).
-
pmonitor
aktív tag
válasz
buherton #6290 üzenetére
Teljesen más a programozási filozófiánk.
A goto esetleg hatékony, de semmiképpen nem egyszerűbb. Elég megérteni, hogy mikor mit csinál. Azért legyünk őszinték: sem a tömeges goto, sem az egymásba ágyazott if nem szép. De valahogy meg kell oldani egy adott feladatot.Komoly neveket említettél, de sztem. én is(csak én nem neveztem meg személyeket, csak azt amit alkottak).
Hiába írod le még egyszer az oop nyelvekre vonatkozó gondolataidat. Ettől függetlenül léteznek olyan problémák, amiket ott is csak egymásba ágyazott if-ekkel lehet megoldani. Attól függetlenül, hogy vannak olyan eszközei, amiket leírtál(azokkal sem lehet mindent megoldani). Erre írtam példának a Java-t, amiben nincs is goto, tehát ott eleve kizárt még a lehetősége is a használatának. Pl. C#-ban sztem. van goto, de sosem néztem meg, mert minek? Én semmiképp nem használom, az biztos.
-
pmonitor
aktív tag
válasz
buherton #6279 üzenetére
Ha már ilyen provokáló választ írtál, akkor reagálok. Kérdésre kérdéssel válaszolok:
Szted. a Java megalkotói nem tudnak programozni? Mert a nyelvben nem létezik a goto utasítás. Ciklusokra van egy kibővített tulajdonsággal rendelkező break, viszont if-es feltételes szerkezetre NINCS. És mégis meg tudnak Javaban is oldani mindent.Sztem. azért ha olyan nyelv is életben tud maradni, amiben nincs goto, akkor érdemes elgondolkodni rajt, hogy tényleg szükség van-e goto-ra.
-
#90088192
törölt tag
válasz
buherton #6268 üzenetére
Akkor atfogalmazom, a processzor egy megadott szögből, képes-e kiszámolni a hozzá tartozó értéket a szögfüggvénynek megfelelően, vagy csak táblázatból lesi ki? Ez a kérdés magában a C nyelvben is. Van e egy táblázat amiből kilesi, vagy van rá eljárás ami ki tudja számolni/meg tudja közelíteni?
-
pmonitor
aktív tag
válasz
buherton #6263 üzenetére
Mondjuk sztem. ez az if mélység még nem veszélyes(értelmezés szempontjából).
De itt is működik új változó bevezetésével az, hogy ha még tovább kellene mélyíteni, akkor a változó(mint kapcsoló) "beállításával" lehet követő if-ben rendezni a további feltételeket.
Nekem is azért nagyon oda kellett figyelnem, hogy ezt a goto-val tele kódot megértsem egyáltalán, hogy mi miért is van. És még így sem biztos, hogy sikerült. Ezért írtam, hogy nem biztos, hogy ekvivalens. Úgyhogy nekem meg a goto-kkal teletűzdelt kód antipattern. -
pmonitor
aktív tag
válasz
buherton #6253 üzenetére
Ezt kalkuláltam ki:
int __init my_init_function(void) {
int err = register_this(ptr1, "skull");
if (!err)
{
err = register_that(ptr2, "skull");
if(!err)
{
err = register_those(ptr3, "skull");
if (err)
{
unregister_that(ptr2, "skull");
unregister_this(ptr1, "skull");
}
} else {
unregister_this(ptr1, "skull");
}
}
return err;
}Lehet, hogy még nem teljesen ekvivalens, de a logika látszik benne.
-
Livius
őstag
válasz
buherton #6196 üzenetére
A National Instrument mérő hardverek 90%-a az Windows 10-re van komoly supporttal és driverekkel ellátva, ezért a saját CVI fordítójuk és IDE-jük volt sok 10 évvel ezelőtt már bevezetve hogy majd az jó lesz. Tehát nincs lehetőség, csak a Windows-ra, és sajnos az se nagyon könnyű eset, hogy az elavult C helyett mondjuk egy C#-ban történjen a GUI-s SW fejlesztés ebben a témában. A WSL2-öt amúgy ismerem, Yocto projectes Linux buildre már teszteltem, elég fasza kezd már lenni.
-
Livius
őstag
válasz
buherton #6163 üzenetére
Ez a coding style vagy coding rules az NI LabWindows CVI-ban programozott GUI-s projekthez kell (rémisztően csak C-ben lehet használni ezt a GUI-s frameworköt). Én eddig a neten mindenhol azt olvasom és azt tanították nekem, hogy a globális változó egy nagy programban már szigorúan kerülendő (itt már nem 8 bites microcontroller a cél HW), jelenleg ahova kellene az már egy nagy program, tele káosszal már sajnos. Valamint ELTE IK C/C++ gyakorlaton instant évismétlés járt a go to és continue használatért, és értettem hogy miért, miután egyszer valaha valami tele go to-zott programot kellett debugolnom, és visszafejtenem. Fenntarthatatlan és karbantarthatatlan lesz a program tőle.
Az Ericsson-os codechekker az Windwos 10-en is életre kelthető? Ez a CVI fordító és IDE csak Windows 10-en megy, ebben megy a napi munka.
-
coco2
őstag
válasz
buherton #6115 üzenetére
Köszönöm a példa linket.
Van esetleg olyan szerver / kliens példa is valahol, ahol a server ténylegesen működik végtelenített echo funkcióval, és minden lépésnél kiírja, ami kliens oldalról éppen érkezett? A linkelt példa csak külső héj, tényleges adatkezelés nincs benne, csak a berkeley socket alapjai, amit megtalálok bárhol.
Az sha-nak a stream kódoláshoz folyamatosan változó kódolási állapota van. Az ember azt hinné, hogy a socketnak van egy kontextus állapota, amit tudni kell menteni / visszatölteni abban az esetben, ha egy thread-en nem csak egy socket-ot kezelek, hanem sokat. Vajon olyan példa is akadhat valahol?
-
#90088192
törölt tag
válasz
buherton #6075 üzenetére
Koszonom
Remélem erre gondoltálKülönben igen érdekes maga a probléma, a bal oldali képernyő gyakorlatilag túlcsordul(Módosítottam a kodon így is duplázza az oszlopokat, es elkezd a 0. oszlopba írni)
Maga a problémás részlet:
void write_char(int line_select, int y_offset, int charcater_code)
{ int x;
if(y_offset>=(Display_width/2) && y_offset<=Display_width-Font_width) //Check which side of the screen need to be activated
{
lcd_select(1); //if the offset is bigger than 63 than the right side
set_y(y_offset-Display_width/2); //Deducts the the half of the display size Set y
set_x(line_select); //Selects line of writing
for(x=(charcater_code-Font_offset)*Font_width; x<=((charcater_code-Font_offset)*Font_width)+Font_width; x++) //Decodes the character code and make sure the data is sent by 8 bits
{
send_data_screen(font6x8[x]); //Sends out the relevant section of the Array
}
} else if(y_offset<=(Display_width/2)-1 && y_offset>=0) {
lcd_select(0); //selects the left side of the screen
set_y(y_offset); //Set y
set_x(line_select); //Selects line of writing
for(x=(charcater_code-Font_offset)*Font_width; x<((charcater_code-Font_offset)*Font_width)+Font_width; x++) //Decodes the character code and make sure the data is sent by 8 bits
{if(y_offset+(x-(charcater_code-Font_offset)*Font_width)!=(Display_width/2)) //Checks if the character has reached the border of the 2 sides of the screen
{
send_data_screen(font6x8[x]);
}else{ //If the Character is belong to the right side
lcd_select(1); //If yes selects the the right side
set_y(0); // Resets the offset
set_x(line_select); //Selects line of writing
send_data_screen(font6x8[x]); //Sends out the relevant section of the Array
}
}
}
else
{
MEMBRANE_MUTE=1;
}
}Es az egesz en block
#include "font6x8.h"
#include "screen.h"
#include "membrane.h"
#define Font_width 6
#define Font_offset 32
#define Font_height 8
#define Display_width 128
#define Dislpay_height 64
#define Display_rows 8
//#define Font_type font6x8
void InitalizePorts_display(void)
{
S_DATA_OUT=0;
S_DATA_IN=0;
DISPLAY_Dir=0;
DISPLAY_CS1=1;
DISPLAY_CS2=1;
DISPLAY_RS=1;
DISPLAY_RW=0;
DISPLAY_EN=0;
/* Command port direction settings */
DISPLAY_CS1_Direction =0 ;
DISPLAY_CS2_Direction =0 ;
DISPLAY_RS_Direction =0 ;
DISPLAY_RW_Direction =0 ;
DISPLAY_EN_Direction =0 ;
DelayUs(100);
}
void lcd_select(int s)
{
if(s==0)
{
DISPLAY_CS1 = 1; //Selects Left side of the screen
DISPLAY_CS2 = 0; //Deselects Right side of the screen
DelayUs(15);
}else if(s==1)
{
DISPLAY_CS1 = 0; //Deselects Left side of the screen
DISPLAY_CS2 = 1; //Selects Right side of the screen
DelayUs(15);
}else{
DISPLAY_CS1 = 1; //Selects Left side of the screen
DISPLAY_CS2 = 1; //Selects Right side of the screen
DelayUs(15);
}
}
void strobe_E(void) //Turns enabling line off/on
{
DelayUs(5);
DISPLAY_EN = 0; //Turns Display Off
DelayUs(5);
DISPLAY_EN = 1; //Turns Display On
DelayUs(5);
}
void set_y(int y) //Set Y coordinate 0-63 on the active side of the screen
{
DISPLAY_RS = 0; //Sets Instruction mode
DelayUs(5);
S_DATA_OUT = (0b01000000+y); //Set Y coordinate
strobe_E();
}
void set_x(int x) //Select one of the 8 bit line out of the 8
{
if(x<=Display_rows-1 && x>=0) // Verify input parameter is in range
{
DelayUs(5);
DISPLAY_RS = 0; //Sets Instruction mode
DelayUs(5);
S_DATA_OUT = 0b10111000+x; //select the desired line from the 8 X 8bit lines
strobe_E();
}else{
MEMBRANE_MUTE=1;
}
}
void send_data_screen (long int Data) //Sends Data to the Display hardware
{
DISPLAY_RS = 1; //Enables Data mode
DelayUs(5);
S_DATA_OUT = Data; //Insert Data to the hardware line
strobe_E();
}
void dsp_on(void)
{
DISPLAY_RS = 0; //Instruction mode
DelayUs(2);
S_DATA_OUT = 0b00111111; //Turns display controller ON
DelayUs(2);
DISPLAY_EN = 1; //Turns Enable line ON
strobe_E();
}
void clr_scr (int Fill)
{
int x; int y;
lcd_select(2); //Select both side of the display for quicker action
for(y=0;y<=Display_rows-1;y++) //Loop for the rows
{
set_y(0); //Set y to 0
set_x(y); //Selects line of writing
for(x=0; x<(Display_width/2); x++) //Loop for the columns
{
send_data_screen(Fill);
}
}
}
void write_char(int line_select, int y_offset, int charcater_code)
{ int x;
if(y_offset>=(Display_width/2) && y_offset<=Display_width-Font_width) //Check which side of the screen need to be activated
{
lcd_select(1); //if the offset is bigger than 63 than the right side
set_y(y_offset-Display_width/2); //Deducts the the half of the display size Set y
set_x(line_select); //Selects line of writing
for(x=(charcater_code-Font_offset)*Font_width; x<=((charcater_code-Font_offset)*Font_width)+Font_width; x++) //Decodes the character code and make sure the data is sent by 8 bits
{
send_data_screen(font6x8[x]); //Sends out the relevant section of the Array
}
} else if(y_offset<=(Display_width/2)-1 && y_offset>=0) {
lcd_select(0); //selects the left side of the screen
set_y(y_offset); //Set y
set_x(line_select); //Selects line of writing
for(x=(charcater_code-Font_offset)*Font_width; x<((charcater_code-Font_offset)*Font_width)+Font_width; x++) //Decodes the character code and make sure the data is sent by 8 bits
{if(y_offset+(x-(charcater_code-Font_offset)*Font_width)!=(Display_width/2)) //Checks if the character has reached the border of the 2 sides of the screen
{
send_data_screen(font6x8[x]);
}else{ //If the Character is belong to the right side
lcd_select(1); //If yes selects the the right side
set_y(0); // Resets the offset
set_x(line_select); //Selects line of writing
send_data_screen(font6x8[x]); //Sends out the relevant section of the Array
}
}
}
else
{
MEMBRANE_MUTE=1;
}
}
void string_out(char* message, float variable, int line, int y_offset)
{
int Maximum_num_char= Display_width/Font_width; //Maximum number of characters what can be placed in one row
char test[Maximum_num_char],i=0,j;
char a[Maximum_num_char];
sprintf(a, "%s%f", message, variable);
while(a[i]!='\0') {test[i]=a[i]; i++;}
for(j=0;j<=i-1;j++) write_char(line,y_offset+j*Font_width,test[j]);
} -
-
#90088192
törölt tag
válasz
buherton #6048 üzenetére
Köszönöm
Akkor természetesen jönnek az újabb kérdések, ha nem baj
Akkor a különböző részegységek funkcióit hogyan tudnám szeparálni.
Vagyis a mostani screen.c bol csináltam screen.h, így működik, de ha újabb .h-t hívok meg amiben egy előzőleg meghívott hardware.h benne van akkor megint ugyan az a probléma.
Tudom hülye kérdés, ilyen alap struktúra probléma, de fogalmam sincs ezekre hogyan keressek rá.
Amit el akarok erni: reszegysegenkent kulon fuggveny konyvtar vagy mi a fitty fene.(Nem tudom minek nevezzem)
Azt hogyan kellene strukturalni?Közben kutakodtam, ezt találtam.
ez a hardware.h
#include "stdio.h"
#include <string.h>
#include <math.h>
#include <p32xxxx.h>
#include <D:\Program Files (x86)\Microchip\xc32\v2.30\pic32mx\include\peripheral\legacy\i2c_legacy.h>
#define SYS_FREQ 80000000L
#define FCY SYS_FREQ
#define F_CPU SYS_FREQ
#define DLY_COUNT (F_CPU/4000000)
#define _delay_us( dly ) {unsigned int x=0,y=dly; while(y--){x=DLY_COUNT;while(x--);}}
// DEVCFG3
// USERID = No Setting
#pragma config FSRSSEL = PRIORITY_1 // SRS Select (SRS Priority 1)
#pragma config FCANIO = OFF // CAN I/O Pin Select (Alternate CAN I/O)
#pragma config FUSBIDIO = OFF // USB USID Selection (Controlled by Port Function)
#pragma config FVBUSONIO = OFF // USB VBUS ON Selection (Controlled by Port Function)
// DEVCFG2
#pragma config FPLLIDIV = DIV_2 // PLL Input Divider (2x Divider)
#pragma config FPLLMUL = MUL_20 // PLL Multiplier (20x Multiplier)
#pragma config UPLLIDIV = DIV_2 // USB PLL Input Divider (2x Divider)
#pragma config UPLLEN = ON // USB PLL Enable (Enabled)
#pragma config FPLLODIV = DIV_1 // System PLL Output Clock Divider (PLL Divide by 1)
// DEVCFG1
#pragma config FNOSC = FRCPLL // Oscillator Selection Bits (Fast RC Osc with PLL)
#pragma config FSOSCEN = ON // Secondary Oscillator Enable (Enabled)
#pragma config IESO = ON // Internal/External Switch Over (Enabled)
#pragma config POSCMOD = XT // Primary Oscillator Configuration (XT osc mode)
#pragma config OSCIOFNC = OFF // CLKO Output Signal Active on the OSCO Pin (Disabled)
#pragma config FPBDIV = DIV_2 // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/2)
#pragma config FCKSM = CSDCMD // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled)
#pragma config WDTPS = PS1048576 // Watchdog Timer Postscaler (1:1048576)
#pragma config FWDTEN = OFF // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))
// DEVCFG0
#pragma config DEBUG = OFF // Background Debugger Enable (Debugger is disabled)
#pragma config ICESEL = ICS_PGx2 // ICE/ICD Comm Channel Select (ICE EMUC2/EMUD2 pins shared with PGC2/PGD2)
#pragma config PWP = OFF // Program Flash Write Protect (Disable)
#pragma config BWP = OFF // Boot Flash Write Protect bit (Protection Disabled)
#pragma config CP = OFF // Code Protect (Protection Disabled)
//I/O Digital analog selection
#define Analog_digital AD1PCFG
//Screen Hardware Setup
#define DISPLAY_Dir TRISE
#define S_DATA_OUT LATE
#define S_DATA_IN PORTE
#define DISPLAY_CS1 LATGbits.LATG6
#define DISPLAY_CS2 LATDbits.LATD8
#define DISPLAY_RS LATGbits.LATG9
#define DISPLAY_RW LATDbits.LATD7
#define DISPLAY_EN LATDbits.LATD11
#define DISPLAY_CS1_Direction TRISGbits.TRISG6
#define DISPLAY_CS2_Direction TRISDbits.TRISD8
#define DISPLAY_RS_Direction TRISGbits.TRISG9
#define DISPLAY_RW_Direction TRISDbits.TRISD7
#define DISPLAY_EN_Direction TRISDbits.TRISD11
//Membrane
#define JTAGEN DDPCONbits.JTAGEN
#define MEMBRANE_MUTE LATBbits.LATB13
#define MEMBRANE_MAINS LATBbits.LATB14
#define MEMBRANE_ALARM LATBbits.LATB15
#define MEMBRANE_MUTE_Direction TRISBbits.TRISB13
#define MEMBRANE_MAINS_Direction TRISBbits.TRISB14
#define MEMBRANE_ALARM_Direction TRISBbits.TRISB15
//Analog inputs
#define REF2_5 PORTBbits.RB0
#define MUX PORTBbits.RB1
#define BAT1_CURRENT PORTBbits.RB2
#define BAT2_CURRENT PORTBbits.RB3
#define CHARGER_CURRENT PORTBbits.RB4
#define CHARGER_VOLTAGE PORTBbits.RB5
#define LOAD_VOLTAGE PORTBbits.RB8
#define BRIDGE_VOLTAGE PORTBbits.RB9
#define VREQ PORTBbits.RB10
#define IREQ PORTBbits.RB11
#define REF2_5_DIRECTION TRISBbits.TRISB0
#define MUX_DIRECTION TRISBbits.TRISB1
#define BAT1_CURRENT_DIRECTION TRISBbits.TRISB2
#define BAT2_CURRENT_DIRECTION TRISBbits.TRISB3
#define CHARGER_CURRENT_DIRECTION TRISBbits.TRISB4
#define CHARGER_VOLTAGE_DIRECTION TRISBbits.TRISB5
#define LOAD_VOLTAGE_DIRECTION TRISBbits.TRISB8
#define BRIDGE_VOLTAGE_DIRECTION TRISBbits.TRISB9
#define VREQ_DIRECTION TRISBbits.TRISB10
#define IREQ_DIRECTION TRISBbits.TRISB11
void InitalizePorts_membrane()
{
JTAGEN=0;
MEMBRANE_MUTE=1;
MEMBRANE_MAINS=1;
MEMBRANE_ALARM=1;
MEMBRANE_MUTE_Direction =0 ;
MEMBRANE_MAINS_Direction =0 ;
MEMBRANE_ALARM_Direction =0 ;
};
void InitalizePorts_display()
{
S_DATA_OUT=0;
S_DATA_IN=0;
DISPLAY_Dir=0;
DISPLAY_CS1=1;
DISPLAY_CS2=1;
DISPLAY_RS=1;
DISPLAY_RW=0;
DISPLAY_EN=1;
/* Command port direction settings */
DISPLAY_CS1_Direction =0 ;
DISPLAY_CS2_Direction =0 ;
DISPLAY_RS_Direction =0 ;
DISPLAY_RW_Direction =0 ;
DISPLAY_EN_Direction =0 ;
};
void InitalizePorts_ADC()
{
Analog_digital= 0x10C0;
AD1CON2 = 0x0000;
AD1CON3 = 0x0000; // Configure ADC conversion clock
AD1CSSL = 0x0000; // No inputs are scanned. Note: Contents of AD1CSSL are ignored when CSCNA = 0
IFS1CLR = 2; //Clear ADC conversion interrupt
IEC1SET = 2; //Enable ADC conversion interrupt
AD1CON1 = 0x00E0; // SSRC bit = 111 internal counter ends sampling and starts converting
AD1CHS = 0b1111110011110000; // Connect RB2/AN2 as CH0 input in this example RB2/AN2 is the input
AD1CSSL = 0;
AD1CON3 = 0x0F00; // Sample time = 15Tad
AD1CON2 = 0x0004; // Interrupt after every 2 samples
//Analog PORT directions
REF2_5_DIRECTION =1;
MUX_DIRECTION =1;
BAT1_CURRENT_DIRECTION =1;
BAT2_CURRENT_DIRECTION =1;
CHARGER_CURRENT_DIRECTION =1;
CHARGER_VOLTAGE_DIRECTION =1;
LOAD_VOLTAGE_DIRECTION =1;
BRIDGE_VOLTAGE_DIRECTION =1;
VREQ_DIRECTION =1;
IREQ_DIRECTION =1;
};
void I2C1_Init()
{
//***** I2C1 Hardware Init *****/
//-----Set pin drive modes-----
//I2C - drive outputs so we can manually clear lines
LATDbits.LATD9 = 1; //Start with bus in idle mode - both lines high
LATDbits.LATD10 = 1;
ODCDbits.ODCD9 = 1; //Open drain mode
ODCDbits.ODCD10 = 1;
TRISDbits.TRISD9 = 0; //SCL1 output
TRISDbits.TRISD10 = 0; //SDA1 output
/***** I2C1 Module start *****/
I2C1CON = 0x1000; //Set all bits to known state
I2C1CONbits.I2CEN = 0; //Disable until everything set up. Pins will be std IO.
I2C1BRG = 0x00C6; //set up baud rate generator
I2C1CONbits.DISSLW = 0; //Enable slew rate control for 400kHz operation
//IFS1bits.MI2C1IF = 0; //Clear I2C master int flag
I2C1CONbits.I2CEN = 1; //Enable I2C
} ; -
Domonkos
addikt
válasz
buherton #5921 üzenetére
Itt az altalam javasolt megoldas:
#include <stdio.h>
int strcmp(char *s1, char *s2);
int
strcmp(char *s1, char *s2)
{
unsigned c1, c2;
for(;;) {
c1 = *s1++;
c2 = *s2++;
if(c1 != c2) {
if(c1 > c2)
return 1;
return -1;
}
if(c1 == 0)
return 0;
}
}
int
main(int argc, char *argv[]) {
if (argc != 3) {
fputs("argc\n", stderr);
return 1;
}
printf("%d\n", strcmp(argv[1], argv[2]));
return 0;
} -
Dinter
addikt
válasz
buherton #5898 üzenetére
Az a környezet, ahol le kell futtatni a programot az, csak így nem tudom letesztelni akkor.
A program a következő: kapom a sorokat standard inputról, amiről el kell dönteni, hogy illeszkedik-e vagy nem a regex mintára. Majd fájl vége jelnél kiiírni az összes/jó sort 8-as számrendszerben. Ez így működik elvileg?
#include <regex.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int convertDecimalToOctal(int decimalNumber)
{
int octalNumber = 0, i = 1;
while (decimalNumber != 0)
{
octalNumber += (decimalNumber % 8) * i;
decimalNumber /= 8;
i *= 10;
}
return octalNumber;
}
bool reg_matches(const char *str, const char *pattern)
{
regex_t re;
int ret;
if (regcomp(&re, pattern, REG_EXTENDED) != 0)
return false;
ret = regexec(&re, str, (size_t) 0, NULL, 0);
regfree(&re);
if (ret == 0)
return true;
return false;
}
int main()
{
char sor[1000];
int sorok=0;
int jo=0;
const char* pattern="^[^#]_*(0x)?[0-9]*V6.+[A-Z]*.*mmese(B|a)";
while(scanf("%s[^\n]",&sor)!=EOF){
sorok++;
if(reg_matches(sor,pattern)) jo++;
}
int jo8=convertDecimalToOctal(jo);
int sorok8=convertDecimalToOctal(sorok);
printf("%d/%d",sorok8/jo8);
return(0);
} -
G.A.
aktív tag
válasz
buherton #5850 üzenetére
Köszönöm a gyors választ.
dns_answer local_answer -> ez nincs használva.
dns_response -> nincs deklarálva.
local_dns_resp -> nincs deklarálva.
...
dns_answer** answer -> ezt nem használod semmire.A problémás kódrészt próbáltam leegyszerűsítve a hozzászólásba beírni, közben sikerült nekem is belezavarodnom és elírnom.
dns_answer local_answer = local_dns_resp
dns_answer** answer = *dns_responseu8b data[] -> ez nagyon csúnya.
Mitől csúnya? Inkább u8b* data legyen? Még előnybe részesítem a tömböket a pointerekkel szemben, mivel azokat könnyebben kezelem. 8bites uC-n is könnyebben nyomon tudom követni, hogy mennyi RAM-ot is használok...A struct-hoz erősen javaslok egy packed attribute-omot.
Hobbi programozóként nem tudom mit jelent... mire használható.Minek union?
Megint uC-re hivatkozok. Anno #define-t használtam egy tömb változóinak az azonosításához. Ezt cseréltem le unionba ágyazott struktúrákkal. Így értem:typedef union udpv4_header
{
struct
{
my_16b src_port;
my_16b dst_port;
my_16b length;
my_16b checksum;
};
u8b b[8];
}udpv4_header;
A struktúrát használom egy konkrét változó módosításához, majd ha másolom/küldöm az adatcsomagot akkor a b[]-t használom.miért is nem memcpy-k?
Szintén egy hiányosságom. Még nem tanultam meg a használatát...Közben szerintem meglett a megoldás(működik). Ez lett a function() módosított kódja:
void get_data_from_dns_reply(u8b* data, dns_header* dns_resp_header, dns_answer*& dns_response)
{
u8b i = 0;
for (; i < 12; i++)
{
dns_resp_header->b[i] = data[i];
}
dns_response = (dns_answer*)malloc(htons(dns_resp_header->answer_rrs.i) * sizeof(dns_answer));
for(; data[i] != 0; i++)
{
i += data[i];
}
i += 5;
for(u16b j = 0; j < htons(dns_resp_header->answer_rrs.i); j++)
{
i += 12;
for (u8b x = 0; x < 4; x++, i++)
{
dns_response[j].data.b[x] = data[i];
}
}
} -
maestro87
őstag
válasz
buherton #5653 üzenetére
Nem tudom működésre bírni.
Eddig csak úgy ment, hogy a fő struktúrán kívül is deklaráltam illetve extern taggal kivittem másik fájlba, de akkor szerintem az nem ugyanaz a változó volt mint a struktúrában lévő. Egyébként eeprom-ba íráshoz kellene, hogy a struktúrában lévő elemeket egy függvényhívással be tudjam írni, ne kelljen minden elemnél külön meghívni az eeprom-ba író függvényt. -
maestro87
őstag
válasz
buherton #5650 üzenetére
Ezt így nem fordítja le.
Szintaktikai hiba, nincs azonosító a deklarációban stb.
Pontosabban az én kódom így néz ki lefordítva erre a példára:header fájlban:
typedef struct
{
int date;
int month;
int year;
} date;
typedef struct
{
char ename[20];
int ssn;
float salary;
date doj[3];
} Employee;
Employee emp;A main függvénybe írva ezt, nem működik:
emp.date[]=
{
{,,},
{,,},
{,,}
};A pointer-est hogy gondoltad?
-
EQMontoya
veterán
válasz
buherton #5213 üzenetére
Ebben a formában semmit, mert nem fordul le.
program.cc:6:1: error: expected unqualified-id before ‘int’
int b : 0,De ha kicseréli az ember pontosvesszőre...
Na, akkor sem fordul le, de a hibaüzi sokat elmond arra vonatkozóan, amit kérdezni akartál:program.cc:6:13: error: zero width for bit-field ‘<anonymous struct>::b’
int b : 0;De ha a b értékét 1-re módosítod ez után, akkor már egész jó a feladat.
-
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.
-
Hani
aktív tag
válasz
buherton #4904 üzenetére
Wow, ez gyors volt.
Az 1.-nél hasonló gondolatra jutottam én is, aztán negyed óra anyázás után szétszedtem külön átmeneti változókra, de azért izgatja a fantáziámat... ami könyvet meg fellapoztam, mind csak az egyszerűbb részeket mutogatta, ++i, i++, aztán annyi.2. Pöpec. Megcsinálni szívesen megcsinálom, ha így szokás, csak zavar, ha nem tudom az okát.
3. Mivel lehet akkor jól beolvasni a usertől mindenfélét? Illetve ha már itt vagyunk, akkor eszembe jut a getchar is, hogy a Jóistennek sem sikerül beolvastatnom vele egy Entert vagy Escape-et (mondjuk hogy arra kilépjen) - q-t igen, vagy más szép karaktert, de ezeket nem szereti.
4. Volt ennek valami furább verziója, talán int *const p / int const* p / const int* p / int const * const p, de ez is közben tisztázódik az órajárásos megoldással, szép lesz ez.
5. Kár, pedig szép lenne egy beépített szűrő
6. Utánakeresek akkor.
-
-
moseras
tag
válasz
buherton #4874 üzenetére
Üdv!
MinGW/msys/Windows alatt működik. Az nem volt benne a kérdésben, hogy milyen rendszer alatt akarja futtatni, lehet mikrokontroller, Windows, Linux, Mac, BSD, akármi más. Egyébként is csak a a kimenet demonstrálása miatt írtam le, hogy mit ír ki, nem a fordítás menetét akartam megmutatni. Szerintem Ő van annyira képben, hogy le tudja fordítani az adott rendszerére a programot. Ha nem, akkor majd szól.
Imi.
-
don_peter
senior tag
válasz
buherton #4869 üzenetére
Úgy nézem, hogy az LCD vezérlés pont így működik.
Nem kevés sort kell hozzá legépelni
Egyelőre nincs rá szükségem így addig nem is feszegetem a témát.
Csak ésszel adagolom magamnak a dolgot, hogy legyen friss hely és, hogy meg is maradjon az agyamba
Köszi a feltárást és a kiigazítást. -
axioma
veterán
válasz
buherton #4820 üzenetére
Ja, azt hittem fel akarsz venni munkatarsat, es ahhoz kell a teszt...
Konkretan a Siemensben anno ket honapon belul ketszer jutott el hozzam az a kerdes, hogy milyen rendezest kell alkalmazni (mire keressen ra a neten), ha egy kisebb es ritkan valtozo szamhalmazbol nagyon sokszor kell egy masik, surun valtozo szamhoz kivalasztani azt az elemet, amelyik a legnagyobb kezdoszelete. Ezt csinaljak a telefonkozpontok amikor intelligens szolgaltatasok vannak hozzarendelve (a maradek meg a szolgaltatas parametere). Oszinten kivancsi vagyok, hogy erre mit mond a gugli, mar persze ha nem vagod serobol a megoldast.
Termeszetesen nem tesztelni akarlak, csak egy egyszeru eletszagu peldat mondtam, ahol az algotudassal tobbre mentem (jelzem, tok veletlenul egy versenyekre felkeszito mindenen felul felvett oran hallottam... anelkul nem tuti hogy "kirakom"). Megvalositva egyebkent ket kulonbozo nyelven, tok mas programok reszekent lett. -
axioma
veterán
válasz
buherton #4816 üzenetére
C-t akarsz tesztelni vagy algoritmust csak C-ben megvalositva?
(Ami kiguglizhato, az nem azert nem jo kerdes szigoruan szvsz, mert azt munka kozben is kiguglizza es hasznalja. Amit viszont o kell megalkosson... azt eleve tudnia kell.) Persze ha kodolas kell es nem az alkoto munka, akkor mind1.
Multkor egy konyvet neztem amit valaki ajanlott (de mikor mar elvi hibat is vetett a "megoldasban", nem csak elirast meg felesleges, de a megoldast nem zavaro koroket, akkor felreraktam), ott volt egy rakat linkelt listas feladat, ami pointeres, meg az adatszerkezetet is kitalalhatja hozza. Ilyen volt pl. hogy "korrupt" linkelt listaban (az utolso elem valami koztes elemre mutat) keresd meg konstans tarhely es ordo(N) muveletigennyel az elso ismetlodo elemet. De ehhez mar a trukkot kell ismerni (ordo(N^2) vagy felesleges bit per elem megengedesevel persze nem is nehez). -
k.kristof
őstag
válasz
buherton #4812 üzenetére
Valószínűleg azért, mert nem része a C szabványnak, ennek ellenére elég széles körben támogatott a Wikipedia szerint. Egyetemen C++-nál tanította a gyakorlatvezető, de azon kívül én se emlékszem, hogy láttam volna.
-
Doze
aktív tag
válasz
buherton #4780 üzenetére
Jelentkezem megint (köszi a segítséget)
Am egyetemi feladat (nem progmatos az is biztos
), de most meg nem ír ki semmit?, a program lefut... az a baj nem vágom teljesen, szal holnapi vizsgára is agyig rakott puskával megyek...
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int matr[10][10];
void main (void)
{ int i,j,o,s;
clrscr();
printf("Adja meg a m trix sorjainak a sz m t: \n");
scanf("%d", &o);
printf("Adja meg a m trix oszlopainak a sz m t: \n");
scanf("%d", &s);
randomize();
for (i=0; i<o; i++)
for (j=0; j<s; j++)
matr[i][j]=random(100);
for (i=0; j<o; i++)
{
for (j=0; j<s; j++)
{
if ((matr[i][j]%2)==0)
{
printf("%d ",matr[i][j]);
}
}
}
printf("A matrix: \n");
for (i=0; i<o; i++)
{ printf("\n");
for (j=0; j<s; j++)
printf("%5d",matr[i][j]);
}
getch();
} -
dabadab
titán
válasz
buherton #4765 üzenetére
Szerintem Karmanak nem a driverekkel van problemaja, hanem azzal, hogy teljesen random* helyekre ellenallasokat, kondenzatorokat meg egyeb bigyokat kell kotni es ezeket mindenki olyan termeszetesnek veszi, mint a levegovetelt (es ennek megfeleloen nem is nagyon emlitik a szuksegesseguket)
*: nyilvan nem, meg en is szigorlatoztam elektronikabol, de ha barmikor szentte akarnak avatni, akkor azt a harmast nyugodtan felsorolhatjak a csodateteleim kozott
-
Karma
félisten
válasz
buherton #4762 üzenetére
(És egyben don_peternek is válasz.)
Ez villamosmérnök végzettséggel (de gondolom már műszerész/villanyszerelő szakmával szintén) biztosan nem nagy kunszt; de tisztán szoftveres háttérrel, no meg esetemben az informatikus diplomámmal, azzal az egy félévnyi elektronika tárggyal és egy darab mérés laborral - ahol kész sablon alapján össze kellett pakolni breadboardon két áramkört -, azért nem ennyire triviális.
Nyilván meg lehet tanulni a digitális áramkör építést is, jó szakirodalommal vagy mondjuk kompetens ismerőssel. Én csak annyit akartam mondani, hogy szerintem nem ördögtől való, ha kulcsrakész hobbi platformot vesz.
Ha meg élesben is ezzel akar foglalkozni, akkor a Ti hozzáállásotok követendő, természetesen.
-
Karma
félisten
válasz
buherton #4758 üzenetére
"Bármi is legyen a döntésed a használt program nyelv a C legyen. Van Basic meg Arduino, meg mit tudom én mi, de az igazi beágyazott rendszer fejlesztő C-ben dolgozik..."
Az Arduino is C, nem írtak hozzá külön nyelvet, csak van egy kezdőbarátabb bootloader és alapkönyvtár. Igazából technikai akadálya nincs annak, hogy valaki átflashelje és nyersen használja.
-
axioma
veterán
válasz
buherton #4746 üzenetére
Akkor nekem anno hulyeseget tanitottak... en ugy tudtam, hogy az i++ azt jelenti, hogy az adott sorban levo minden mas muvelet utan kell az i=i+1-et erteni, a ++i-nel meg ugyanezt az (ezen muvelettol megfosztott) sor ele. Ez siman eldontene a dolgot ebben az esetben is (azt ertem, hogy csak a ketszer i-nek ertekadasnal van gond, altalanos esetben igaz lesz). Igazabol nem is tudom elkepzelni, hogy mi az az indok, amiert a ford.pr-nak jobb ha nem tartja ezt ebben a spec. esetben is be, de biztos oka van.
Mas kerdes, hogy nem tunik amugy se jo gyakorlatnak semmi olyan kodsort leirni, ami nem ranezesre egyertelmu, hogy mit fog csinalni. Raadasul ez csak 2 sort von ossze egybe, nem egy nagy kaland kiirni, biztositani az elkepzeleseknek megfelelo sorrendet. -
buherton
őstag
válasz
buherton #4730 üzenetére
Majd elfelejtettem.
Előre bocsátom, hogy ez az egyik legszemetebb teszt kérdés a C-ben. Ugyanis ehhez jól kell ismerni a C szabványt, mert abban van leírva, hogy "két szekvencia pont között ha egy változónak egynél többször adunk értéket, akkor nem definiált a működés", azaz nem tudjuk biztosra megmondani, hogy mi lesz az eredmény, mert fordító függő lesz.
Ismerősöm állás interjún kapott egy ilyen feladatot, de volt ám meglepetés, amikor elkezdte mondani a fentebbi szöveget, ugyanis az interjúztató nem tudott erről
. Így nem kell bánkódni azoknak akik nem tudták. Egy évvel ezelőtt én se tudtam volna a helyes választ.
-
Karma
félisten
válasz
buherton #4742 üzenetére
Ilyenről szabványos környezetben nem tudok, de ha a soros portig eljutás kell csak, irányítsd Windowson a comX-re a forgalmat, Linuxon meg a /dev/ttySX-re (ahol X a port száma).
Keresgéltem még egy kicsit, egyre inkább úgy tűnik, hogy a FILE*-ot nem lehet csak úgy helyettesíteni, ez valami avr-gcc sajátosság.
-
don_peter
senior tag
válasz
buherton #4712 üzenetére
Igen PIC18F4550-et használok amelynek azért tágasabb a felhasználható memóriája..
A régebben felmerülő tömb problémát megoldottam már szóval az oké..."SSPCON1"
Azért írtam meg bitenként a beállítást, hogy megtanuljam és mindig, ha vissza keressem értsem mit miért állítottam be.
Nekem így átláthatóbb mint ha egy sorba a 8bit-et állítom.
Ezek a beállítások egy init() függvényen belül vannak így nem zavarnak programozás közben, csak ide az átláthatóság miatt másoltam be...
De, ha már nem lesz rá szükség akkor 1bájtos parancsként fogom én is megírni a beállításokat."Az a probléma hogy a for cikluson belül olvas ki több lapot, vagy a while cikluson belül?"
Ezt a kérdést nem értem.
A kiolvasással nincs gond..még
A beírás nem oké.
A kiolvasásnál én állítom be mennyi sor olvasson ki az szerintem jól működik, de a beírás...A következőket vettem észre még tegnap esete:
Kíváncsiságból vissza olvastattam 100x32 byte-nyi területet és a következőket tapasztalom: (hátha rávilágít a hibára)
Minden 256-odik byte címzésénél 1 byte-tal kevesebbet írt be a memóriába és (32*8)*32 == (8192)byte után válik teljesen üres a memória.
Fura....Kipróbálom ez a "*(pbuf+i)=spi_io(0x00);" verziót.
Az a baj, hogy még a mutatókat nem látom át teljesen. -
alapz@j
tag
válasz
buherton #4707 üzenetére
Van egy string könyvtáram, ahol a String típus egy struktúra, amiben egy char* változó mutat a tényleges karaktersorozatra. Hogy a felhasználónak ne kelljen még plusz a memóriakezeléssel is bajlódnia, a sztringek mutable-ként működnek, úgy, hogy a függvények új memóriaterületet allokálnak az eredménynek, a régi területet pedig felszabadítják free-vel Ez ugye a felhasználó számára nem látszik, mert ő mindig ugyanazt a String változót látja. A konstruktor függvény első verziója egyszerűen felvette a felhasználó által megadott char* értéket. Ez viszont nem jó, mert ha a stack-en van a karaktersorozat (és nem static), akkor ugye az megsemmisül, ha char* x = "x" formában definiált volt, akkor az r/o memóriaterületen van és az első free-nél kiakad a rendszer, stb. Úgyhogy a jelenlegi konstruktor duplikálja a karaktersort a heap-re, ami csak annyiban rossz, hogy ha már eredetileg is ott volt, akkor kétszer annyi memóriát használ a program. Az lenne a legelegánsabb megoldás, ha a konstruktor érzékelné, hogy a paraméter a stack-re, r/o területre vagy a heap-re mutat és ennek megfelelő memóriafoglalási stratégiát választana.
-
don_peter
senior tag
válasz
buherton #4697 üzenetére
Sajnos mindig változik.
A memória IC tartamától függően.
Van mód a szerkesztésre szóval a memória terület az folyton változhat.
Valószínűleg 3masával fogom feltölteni a tömböt és úgy listáztatom ki léptetéssel a 15-öt, nincs jobb ötletem.
így a tömböm is sokkal kisebb lesz így beleférek a verem keretbe... -
don_peter
senior tag
válasz
buherton #4664 üzenetére
Igazából, most megírtam pár részt, hogy miként működik és elég gyorsan és jól. (elsőre legalább is)
Ha nem "goto" utasítással ugrok vissza egy-egy program részhez akkor egy "else if"-ágas feltétel rendszert kell alkotnom és egy előre deklarált navigációs változóban kell megadjam, hogy éppen melyik ág érvényesüljön.
Így elsőre a "goto" elég átlátható struktúrát adott számomra, de persze nem rossz az "else" ág sem.
Azt olvastam a könyvben, hogy nem jó túl sok feltételt használni a programozás során persze ellenállításként azt is megemlíti, hogy a túl kevés sem jó...
Szóval azt tanácsoljátok, hogy hagyjam a "goto" utasítást?
Nem biztonságos?
Biztonságosabb az "else if" elágazás?A program egy forrasztó állomás vezérlését fogja kiszolgálni.
Pár mondatban összefoglalom hogyan is állok most és mi lenne az elképzelés:Gép bekapcsolásnál ellenőrzés megy végbe mely megvizsgálja az utolsó használt hőprofilt és ha van ilyen akkor betölti és automatikusan felkínálja a program elindítását. (nem térek ki a program futására...)
Ha nincs utoljára betöltött hőprofil vagy hibás akkor ezt a hibát közli és ugrania kell a menüre.
A menüben több menüpontból lehet választani mint pl.: Új profil hozzáadása, Aktuális profil szerkesztése, Elmentett profilok kilistázása, és még pár.
Ezek közt kell gyakorlatilag navigálnom...
-
Jester01
veterán
válasz
buherton #4664 üzenetére
Hogy nem általános és nem ajánlott az nézőpont kérdése. A linux kernel például tele van vele (konkrétan 112235 darabot számoltam össze), mert erőforrás felszabadításhoz hiba után hasznos. Például:
gcm_zeroes = kzalloc(16, GFP_KERNEL);
if (!gcm_zeroes) return -ENOMEM;
err = crypto_register_template(&crypto_gcm_base_tmpl);
if (err) goto out;
err = crypto_register_template(&crypto_gcm_tmpl);
if (err) goto out_undo_base;
err = crypto_register_template(&crypto_rfc4106_tmpl);
if (err) goto out_undo_gcm;
err = crypto_register_template(&crypto_rfc4543_tmpl);
if (err) goto out_undo_rfc4106;
return 0;
out_undo_rfc4106:
crypto_unregister_template(&crypto_rfc4106_tmpl);
out_undo_gcm:
crypto_unregister_template(&crypto_gcm_tmpl);
out_undo_base:
crypto_unregister_template(&crypto_gcm_base_tmpl);
out:
kfree(gcm_zeroes);
return err; -
don_peter
senior tag
válasz
buherton #4656 üzenetére
Sikeres volt a vissza fejtés..
Rájöttem, hogy mivel 16bit-es adatot adok át így hexában tárolja. (logikus)
Itt egy példa ha valaki le akarja még tesztelni:typedef union INT16 {
short int value;
struct{
unsigned char low;
unsigned char hight;
}bytes;
}INT16;
void main(void){
INT16 temp;
temp.value = 900;
printf("%x\n", temp.bytes.low);
printf("%x\n", temp.bytes.hight);
printf("%i\n", temp.bytes);
}Most már világos
Köszi a rávezetést...
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Lenovo Legion 5 Gaming. Az ár irányár, komoly érdeklődés esetén van lehetőség egyeztetésre
- BESZÁMÍTÁS! Asus Prime A320M R5 1600 16GB DDR4 512GB SSD GTX 1050 Ti 4GB Rampage SHIVA TT 500W
- TELJES KÖRŰ IT BESZERZÉS
- Csere-Beszámítás! Asus Számítógép PC Játékra! R5 1600X / GTX 1080 8GB / 32GB DDR4 / 256SSD + 2TB HDD
- ÁRGARANCIA!Épített KomPhone i5 12400F 16/32/64GB RAM RTX 4060 Ti 8GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged