1 / 27

Portability Issues

Portability Issues. CIS*2450 Advanced Programming Concepts. Reference. The Practice of Programming by Brian W. Kernighan and Rob Pike, Addison-Wesley, 1999. Portability Issues. Ideally you should be able to move your program to a different compiler, processor or operating system.

Download Presentation

Portability Issues

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Portability Issues CIS*2450 Advanced Programming Concepts

  2. Reference • The Practice of Programming by Brian W. Kernighan and Rob Pike, Addison-Wesley, 1999.

  3. Portability Issues • Ideally you should be able to move your program to a different compiler, processor or operating system. • In practice, one strives for code that takes only a few revisions to make it work on another system.

  4. Portability Issues • Why worry about portability? • successful programs are expected to do more than what was originally planned • environments change • portable programs are better: better design, better construction and better testing

  5. Troubles on the Road to Portability

  6. Sizes of Data Types • In C, data type sizes are not defined. #include < stdio.h > int main ( int argc, char *argv[] ) { printf("char = %d, short = %d, int = %d, long = %d\n", sizeof(char),sizeof(short),sizeof(int),sizeof(long)); printf("float = %d, double = %d, pointer = %d\n", sizeof(float),sizeof(double),sizeof(void *)); }

  7. Sizes of Data Types • In C, data type sizes are not defined. > testsize char = 1, short = 2, int = 4, long = 4 float = 4, double = 8, pointer = 4

  8. Sizes of Data Types • It is not even required that a pointer value fit into an int! • The only rules that you can follow are sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) sizeof(float) <= sizeof(double) • char must have at least 8 bits, short and int at least 16 and long at least 32

  9. Sizes of Data Types • Always use sizeof. Used sizeof Didn’t use sizeof!

  10. Alignment of Structure Members • The alignment of items within a structure is not defined except that the order of items in the declaration is observed. • What will the following program print out?

  11. Alignment of Structure Members int main ( int argc, char *argv[] ) { struct X { char c; int i; }; printf("Sizeof c = %d and sizeof i = %d and sizeof X = %d\n", sizeof(char), sizeof(int), sizeof(struct X)); }

  12. Alignment of Structure Members int main ( int argc, char *argv[] ) { struct X { char c; int i; }; printf(“sizeof c = %d and sizeof i = %d and sizeof X = %d\n", sizeof(char), sizeof(int), sizeof(struct X)); } sizeof c = 1 and sizeof i = 4 and sizeof X = 8

  13. Alignment of Structure Members • Never assume that the elements of a structure occupy contiguous memory. • Most machines require that n-byte primitive data types be stored at an n-byte boundary. • The compiler may force different alignments for performance reasons. • Optimization options can affect packing, too.

  14. Order of Evaluation • In C, the order of evaluation of operands, side effects, and function arguments is not defined. • What is evaluated first in the following statements and does the order matter?

  15. Order of Evaluation ptr[count] = name[++count]; printf("%c %c\n",getchar(),getchar()); printf("%f %s\n",log(-1.23),strerror(errno));

  16. Order of Evaluation int main ( int argc, char *argv[] ) { int i; int count = 0; int count2 = 0; int name[10], ptr[10], ptr2[10]; for ( i=0; i < 10; i++ ) { name[i] = i; ptr[i] = ptr2[i] = 0; }

  17. Order of Evaluation int main ( int argc, char *argv[] ) { int i; int count = 0; int count2 = 0; int name[10], ptr[10], ptr2[10]; for ( i=0; i < 10; i++ ) { name[i] = i; ptr[i] = ptr2[i] = 0; } for ( i=0; i < 5; i++ ) { ptr[count] = name[++count]; ptr2[count2] = name[count2++]; }

  18. Order of Evaluation int main ( int argc, char *argv[] ) { int i; int count = 0; int count2 = 0; int name[10], ptr[10], ptr2[10]; for ( i=0; i < 10; i++ ) { name[i] = i; ptr[i] = ptr2[i] = 0; } for ( i=0; i < 5; i++ ) { ptr[count] = name[++count]; ptr2[count2] = name[count2++]; } for ( i=0; i < 5; i++ ) printf("%d %d %d\n",name[i],ptr[i],ptr2[i]); printf("%c %c\n",getchar(),getchar()); }

  19. Order of Evaluation > Testorder 0 10ptr[count] = name[++count];ptr2[count2] = name[count2++]; 1 21 2 32 3 43 4 54 ab input b a printf("%c %c\n",getchar(),getchar());

  20. Unambiguous Code – I int main ( int argc, char *argv[] ) { int i, count = 0; int name[10], ptr[10]; for ( i=0; i < 10; i++ ) name[i] = i; for ( i=0; i < 5; i++ ) { ptr[count] = name[count]; count++; } for ( i=0; i < 5; i++ ) printf("%d %d\n",name[i],ptr[i]); printf("%c ",getchar()); printf("%c\n",getchar()); }

  21. Unambiguous Code – I > goodorder 0 0 1 1 for ( i=0; i < 5; i++ ) { 2 2 ptr[count] = name[count]; 3 3 count++; 4 4 } ab a b printf("%c ",getchar()); printf("%c\n",getchar());

  22. Unambiguous Code – II int main ( int argc, char *argv[] ) { int i, count = 0; int name[10],ptr[10]; for ( i=0; i < 10; i++ ) name[i] = i; for ( i=0; i < 5; i++ ) { ptr[count] = name[count+1]; count++; } for ( i=0; i < 5; i++ ) printf("%d %d\n",name[i],ptr[i]); }

  23. Unambiguous Code – II > good2order 0 1 1 2 2 3 3 4 4 5

  24. Hints • Always use sizeof. • Say exactly what you mean -- make sure that you have not introduced ambiguities because of sloppy coding.

  25. Hints • Study the features and problems of the language that you are working in. • Never assume that a structure is organized contiguously.

  26. Hints • Do not write code that relies on a certain compiler interpretation for correctness. • Use the simplest data and control structures that you can.

  27. Hints • Listen to all compiler warnings! (-Wall) • Study the function libraries that you are using. Make sure that you understand what every function is returning and what it expects as parameters.

More Related