Re: [lambda] Segmentation fault in simple lambda program

2009-04-30 Thread Smith-Rowland, Edward M

Esben Mose Hansen  writes:

> this program SEGFAULTs
>
> #include 
>
> int main() {
>   int numbers[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
>   const std::size_t nn = sizeof(numbers)/sizeof(int);
>   int sum = 0;
>   int f = 5;
>   std::for_each(&numbers[0], &numbers[nn],  [&]  (int n)  { 
> sum += n * f; 
>   });
>
> }
>
> Now, my assembly days are some 15 years past, but the disassembly is
>
> 0x08048424 <_ZZ4mainENK9__lambda0clEiz+0>:  push   %ebp
> 0x08048425 <_ZZ4mainENK9__lambda0clEiz+1>:  mov%esp,%ebp
> 0x08048427 <_ZZ4mainENK9__lambda0clEiz+3>:  mov0x8(%ebp),%eax
> 0x0804842a <_ZZ4mainENK9__lambda0clEiz+6>:  mov0x4(%eax),%eax
> 0x0804842d <_ZZ4mainENK9__lambda0clEiz+9>:  mov0x8(%ebp),%edx
> 0x08048430 <_ZZ4mainENK9__lambda0clEiz+12>: mov0x4(%edx),%edx
> 0x08048433 <_ZZ4mainENK9__lambda0clEiz+15>: mov(%edx),%ecx
> 0x08048435 <_ZZ4mainENK9__lambda0clEiz+17>: mov0x8(%ebp),%edx
> 0x08048438 <_ZZ4mainENK9__lambda0clEiz+20>: mov(%edx),%edx
> 0x0804843a <_ZZ4mainENK9__lambda0clEiz+22>: mov(%edx),%edx
> 0x0804843c <_ZZ4mainENK9__lambda0clEiz+24>: imul   0xc(%ebp),%edx
> 0x08048440 <_ZZ4mainENK9__lambda0clEiz+28>: lea(%ecx,%edx,1),%edx
> => SEGFAULT 0x08048443 <_ZZ4mainENK9__lambda0clEiz+31>: mov%edx,(%eax)
> 0x08048445 <_ZZ4mainENK9__lambda0clEiz+33>: pop%ebp
> 0x08048446 <_ZZ4mainENK9__lambda0clEiz+34>: ret
>
> I have marked the segfault spot. I also find 0x0804843a suspicious, but then 
> I 
> don't even know how to print register values in gcc. 
>
> Any pointers to where I should dig? I am completely new to gcc hacking, just 
> dying to get lambda into gcc 4.5 :)
>
> P.S: Shouldn't gcc show the actual lambda function code ( sum+= f*c; ) 
> instead 
> of the assembly code in any case?

When I try to specify the capture it works ((&sum, &f) works too but f is 
const):

#include 

int
main(void)
{
  int numbers[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  const std::size_t nn = sizeof(numbers)/sizeof(int);
  int sum = 0;
  int f = 5;

  //std::for_each(&numbers[0], &numbers[nn], [&](int n) { sum += n * f; });

  std::for_each(&numbers[0], &numbers[nn], [&sum, f](int n) { sum += n * f; });

  return 0;
}


Broken link for Modula-3 front end.

2007-12-07 Thread Smith-Rowland, Edward M
Here is a minute tidbit.

When I click on the Modula-3 link:
  http://www.m3.org/
it rolls over to:
  http://www.igencorp.com/igencorp/

Ii looks like they moved to:
  http://www.modula3.org/

Ed Smith-Rowland