这个数组初始化 那里错了?

时间:2022-09-03 10:23:51
static
数组定义:
struct {
  unsigned int sblimit;
  unsigned char const offsets[30];
} const sbquant_table[5] = {
  /* ISO/IEC 11172-3 Table B.2a */
  { 27, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } },
  /* ISO/IEC 11172-3 Table B.2b */
  { 30, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } },
  /* ISO/IEC 11172-3 Table B.2c */
  {  8, { 5, 5, 2, 2, 2, 2, 2, 2 } }, /* 2 */
  /* ISO/IEC 11172-3 Table B.2d */
  { 12, { 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }, /* 3 */
  /* ISO/IEC 13818-3 Table B.1 */
  { 30, { 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }
};

编译后错误:
c:\libmad\layer12.cpp(223) : error C2440: 'initializing' : cannot convert from 'const int' to 'const struct '
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\libmad\layer12.cpp(223) : error C2552: 'sbquant_table' : non-aggregates cannot be initialized with initializer list
c:\libmad\layer12.cpp(223) : error C2078: too many initializers
c:\libmadl\ayer12.cpp(223) : error C2073: 'sbquant_table' : partially initialized array requires a default constructor
Error executing cl.exe.


编译环境:

Visual C++ 6.0 (SP5)

21 个解决方案

#1


请不要用VC6

d:\>g++ test.cpp
test.cpp:22:2: warning: no newline at end of file

d:\>gcc test.cpp
test.cpp:22:2: warning: no newline at end of file

d:\>


1>------ 已启动生成: 项目: Console, 配置: Debug Win32 ------
1>正在编译...
1>Console.cpp
1>生成日志保存在“file://d:\工程区\VS.NET工程区(9)\Console\Console\Debug\BuildLog.htm”
1>Console - 0 个错误,0 个警告
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========


无问题

#2


恐怕const位置vc6不认,将结构体和数值的定义分开看看

#3


dev也显示正确

#4


这个项目是用VC6。0开发的,有没有其他的解决方法啊?

#5


引用 4 楼 showyou 的回复:
这个项目是用VC6。0开发的,有没有其他的解决方法啊?

写个函数是运行时刻足够早的函数,在里面赋值呗.

#6


楼主把代码移植到vc8.0+版本试一下~~
如果当时的代码编写按照c++标准的话,工程应该只是重新编译下就行,不需要对源码改动

#7


struct { 
  unsigned int sblimit; 
  unsigned char  offsets[30]; 
} const sbquant_table[5] = { 
  /* ISO/IEC 11172-3 Table B.2a */ 
  { 27, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } }, 
  /* ISO/IEC 11172-3 Table B.2b */ 
  { 30, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } }, 
  /* ISO/IEC 11172-3 Table B.2c */ 
  {  8, { 5, 5, 2, 2, 2, 2, 2, 2 } }, /* 2 */ 
  /* ISO/IEC 11172-3 Table B.2d */ 
  { 12, { 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }, /* 3 */ 
  /* ISO/IEC 13818-3 Table B.1 */ 
  { 30, { 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } } 
}; 

上面那个去掉const,在VS2008也正常

#8


unsigned char const offsets

由于是const,不能直接改offsets,利用内存偏移...

(char*)&sbquant_table[0]+4 就是sbquant_table[0]的数组成员的第一个元素的位置

#9


=_=

#10


#include<stdio.h>
void main()
{
struct 

unsigned int sblimit; 
unsigned char  offsets[30]; 
} const sbquant_table[5] = { 
/* ISO/IEC 11172-3 Table B.2a */ 
{ 27, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } }, 
/* ISO/IEC 11172-3 Table B.2b */ 
{ 30, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } }, 
/* ISO/IEC 11172-3 Table B.2c */ 
{  8, { 5, 5, 2, 2, 2, 2, 2, 2 } }, /* 2 */ 
/* ISO/IEC 11172-3 Table B.2d */ 
{ 12, { 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }, /* 3 */ 
/* ISO/IEC 13818-3 Table B.1 */ 
{ 30, { 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } } 
};
}

定义offsets[30]为unsigned char  就可以了,无需用const.

#11


楼上的,还是一样的错误啊, 有啥更好的方法哇?总不会让我一个个负值把,

#12


ding !!

#13


引用 11 楼 showyou 的回复:
楼上的,还是一样的错误啊, 有啥更好的方法哇?总不会让我一个个负值把,

clean下,重新编译..偶在VC6.0下试了下,没问题

#14


引用 13 楼 zgjxwl 的回复:
引用 11 楼 showyou 的回复:
楼上的,还是一样的错误啊, 有啥更好的方法哇?总不会让我一个个负值把,

clean下,重新编译..偶在VC6.0下试了下,没问题


老兄,你能不能把你vc6.0的那个工程发给我啊?我这里怎么弄也弄不出来。还是编译不过。

你的具体的编译环境也告诉我一下吧,

mail: dragonfly0611@163.com 

谢拉,

#15


10楼的也能过,怎么你的不能过...

#16


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
unsigned int const  data1[5] = {27,30,8,12,30};
unsigned char const data[5][30] = { 
/* ISO/IEC 11172-3 Table B.2a */ 
{ 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } , 
/* ISO/IEC 11172-3 Table B.2b */ 
{ 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } , 
/* ISO/IEC 11172-3 Table B.2c */ 
{ 5, 5, 2, 2, 2, 2, 2, 2 } , /* 2 */ 
/* ISO/IEC 11172-3 Table B.2d */ 
{ 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } , /* 3 */ 
/* ISO/IEC 13818-3 Table B.1 */ 
{ 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } 
}; 
static struct tag_unname{ 
unsigned int sblimit; 
unsigned char const offsets[30]; 
} sbquant_table[5];

void Init()
{
int i;
for (i = 0; i < 5; ++i)
{
*(int*)&sbquant_table[i] = data1[i];
memcpy((char*)&sbquant_table[i]+4, data[i], sizeof(unsigned char)*30);
}
}
int main(int argc, char* argv[])
{
int i, j;
Init();
for (i = 0; i < 5; ++i)
{
printf("%d\t", sbquant_table[i].sblimit);
for (j = 0; j < 30; ++j)
printf("%d ", sbquant_table[i].offsets[j]);
printf("\n");
}
    return 0;
}

#17


代码在code::blocks下编译通过了
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings
 
你的是vc++6.0(sp5)的
是不是打上sp6的补丁试试

#18


vc6.0 sp6
英文版地址:
http://download.microsoft.com/download/1/9/f/19fe4660-5792-4683-99e0-8d48c22eed74/Vs6sp6.exe

简体中文版地址:
http://download.microsoft.com/download/e/c/9/ec94a5d4-d0cf-4484-8b7a-21802f497309/Vs6sp6.exe

#19


我在linux下面,无法帮楼主测试到底是不是补丁的原因了

#20


谢谢各位的帮忙,问题解决了,我打了sp6的patch就好了。不过,最后我还是用了baihacker的方法,谢谢

#21


up 16L

#1


请不要用VC6

d:\>g++ test.cpp
test.cpp:22:2: warning: no newline at end of file

d:\>gcc test.cpp
test.cpp:22:2: warning: no newline at end of file

d:\>


1>------ 已启动生成: 项目: Console, 配置: Debug Win32 ------
1>正在编译...
1>Console.cpp
1>生成日志保存在“file://d:\工程区\VS.NET工程区(9)\Console\Console\Debug\BuildLog.htm”
1>Console - 0 个错误,0 个警告
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========


无问题

#2


恐怕const位置vc6不认,将结构体和数值的定义分开看看

#3


dev也显示正确

#4


这个项目是用VC6。0开发的,有没有其他的解决方法啊?

#5


引用 4 楼 showyou 的回复:
这个项目是用VC6。0开发的,有没有其他的解决方法啊?

写个函数是运行时刻足够早的函数,在里面赋值呗.

#6


楼主把代码移植到vc8.0+版本试一下~~
如果当时的代码编写按照c++标准的话,工程应该只是重新编译下就行,不需要对源码改动

#7


struct { 
  unsigned int sblimit; 
  unsigned char  offsets[30]; 
} const sbquant_table[5] = { 
  /* ISO/IEC 11172-3 Table B.2a */ 
  { 27, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } }, 
  /* ISO/IEC 11172-3 Table B.2b */ 
  { 30, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } }, 
  /* ISO/IEC 11172-3 Table B.2c */ 
  {  8, { 5, 5, 2, 2, 2, 2, 2, 2 } }, /* 2 */ 
  /* ISO/IEC 11172-3 Table B.2d */ 
  { 12, { 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }, /* 3 */ 
  /* ISO/IEC 13818-3 Table B.1 */ 
  { 30, { 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } } 
}; 

上面那个去掉const,在VS2008也正常

#8


unsigned char const offsets

由于是const,不能直接改offsets,利用内存偏移...

(char*)&sbquant_table[0]+4 就是sbquant_table[0]的数组成员的第一个元素的位置

#9


=_=

#10


#include<stdio.h>
void main()
{
struct 

unsigned int sblimit; 
unsigned char  offsets[30]; 
} const sbquant_table[5] = { 
/* ISO/IEC 11172-3 Table B.2a */ 
{ 27, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } }, 
/* ISO/IEC 11172-3 Table B.2b */ 
{ 30, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } }, 
/* ISO/IEC 11172-3 Table B.2c */ 
{  8, { 5, 5, 2, 2, 2, 2, 2, 2 } }, /* 2 */ 
/* ISO/IEC 11172-3 Table B.2d */ 
{ 12, { 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }, /* 3 */ 
/* ISO/IEC 13818-3 Table B.1 */ 
{ 30, { 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } } 
};
}

定义offsets[30]为unsigned char  就可以了,无需用const.

#11


楼上的,还是一样的错误啊, 有啥更好的方法哇?总不会让我一个个负值把,

#12


ding !!

#13


引用 11 楼 showyou 的回复:
楼上的,还是一样的错误啊, 有啥更好的方法哇?总不会让我一个个负值把,

clean下,重新编译..偶在VC6.0下试了下,没问题

#14


引用 13 楼 zgjxwl 的回复:
引用 11 楼 showyou 的回复:
楼上的,还是一样的错误啊, 有啥更好的方法哇?总不会让我一个个负值把,

clean下,重新编译..偶在VC6.0下试了下,没问题


老兄,你能不能把你vc6.0的那个工程发给我啊?我这里怎么弄也弄不出来。还是编译不过。

你的具体的编译环境也告诉我一下吧,

mail: dragonfly0611@163.com 

谢拉,

#15


10楼的也能过,怎么你的不能过...

#16


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
unsigned int const  data1[5] = {27,30,8,12,30};
unsigned char const data[5][30] = { 
/* ISO/IEC 11172-3 Table B.2a */ 
{ 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } , 
/* ISO/IEC 11172-3 Table B.2b */ 
{ 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } , 
/* ISO/IEC 11172-3 Table B.2c */ 
{ 5, 5, 2, 2, 2, 2, 2, 2 } , /* 2 */ 
/* ISO/IEC 11172-3 Table B.2d */ 
{ 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } , /* 3 */ 
/* ISO/IEC 13818-3 Table B.1 */ 
{ 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } 
}; 
static struct tag_unname{ 
unsigned int sblimit; 
unsigned char const offsets[30]; 
} sbquant_table[5];

void Init()
{
int i;
for (i = 0; i < 5; ++i)
{
*(int*)&sbquant_table[i] = data1[i];
memcpy((char*)&sbquant_table[i]+4, data[i], sizeof(unsigned char)*30);
}
}
int main(int argc, char* argv[])
{
int i, j;
Init();
for (i = 0; i < 5; ++i)
{
printf("%d\t", sbquant_table[i].sblimit);
for (j = 0; j < 30; ++j)
printf("%d ", sbquant_table[i].offsets[j]);
printf("\n");
}
    return 0;
}

#17


代码在code::blocks下编译通过了
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings
 
你的是vc++6.0(sp5)的
是不是打上sp6的补丁试试

#18


vc6.0 sp6
英文版地址:
http://download.microsoft.com/download/1/9/f/19fe4660-5792-4683-99e0-8d48c22eed74/Vs6sp6.exe

简体中文版地址:
http://download.microsoft.com/download/e/c/9/ec94a5d4-d0cf-4484-8b7a-21802f497309/Vs6sp6.exe

#19


我在linux下面,无法帮楼主测试到底是不是补丁的原因了

#20


谢谢各位的帮忙,问题解决了,我打了sp6的patch就好了。不过,最后我还是用了baihacker的方法,谢谢

#21


up 16L