我在将指针数组传递给函数时遇到麻烦。我将发布一个简单的示例,但仍然对我不起作用。你能告诉我我在做什么错吗?
import time
from datetime import datetime
from calendar import timegm
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, String, Integer, DateTime, TypeDecorator, create_engine
class Timestamp(TypeDecorator):
impl = DateTime
def process_bind_param(self, value, dialect):
if value is None:
return
elif isinstance(value, datetime):
return value
elif isinstance(value, (int, float)):
return datetime.utcfromtimestamp(value)
raise TypeError("Any form of time object required, but received {}".format(type(value).__name__))
def process_result_value(self, value, dialect):
if value is None:
return None # support nullability
elif isinstance(value, datetime):
return float(timegm(value.timetuple()))
raise vn.ValidationTypeError("datetime object required, but received {}".format(type(value).__name__))
Base = declarative_base()
class SystemLog(Base):
__tablename__ = 'systemlog'
id = Column(Integer, primary_key=True)
time = Column(Timestamp, index=True, nullable=False, default=datetime.utcnow)
type = Column(String(20))
message = Column(String(2000))
engine = create_engine('sqlite://')
Session = sessionmaker(bind=engine)
s = Session()
Base.metadata.create_all(engine)
s.commit()
start_time = time.time()
sample_data = [SystemLog(time=start_time + i) for i in xrange(10000)]
s.add_all(sample_data)
s.commit()
答案 0 :(得分:2)
您有两个问题:
数组索引从零开始。也就是说,由N个元素组成的数组的索引从0
到N - 1
(含)
声明int *v[1]
声明v
为指向int
的一个指针的数组,而不是指向指向一个int
的数组的指针。那将是int (*v)[1]
。这也是&v
函数中main
的类型。
第二个问题的解决方案(使用正确的类型)然后导致第三个问题,因为这意味着*v[0]
由于operator precedence而错误。您也需要在此处使用括号,例如(*v)[0]
。
但是 第二个问题(以及后面的第三个问题)是有争议的,因为您不需要“通过引用”传递数组。
数组自然衰减到指向第一个元素的指针。当使用纯v
且预期指向int
的指针时,编译器会自动将其转换为&v[0]
。
这意味着您可以声明函数以简单地将int *
作为参数,并简单地将普通v
作为参数。
答案 1 :(得分:1)
首先,请注意,实例化基于C语言中的0
,即,第一个(并且,在您为您自己的情况下)元素是v[0]
。
关于传递它,只需将参数定义为指向int的指针,即int*
。类型为int[1]
的变量在传递给函数时将衰减为指向int的指针(因此,无需编写transformare(&v)
及其transformare(v)
。
int transformare(int *v)
{
v[0] = 10;
return 0;
}
int main()
{
int v[1];
printf("n = ");
scanf("%d", &v[0]);
transformare(v);
printf("%d", v[0]);
return 0;
}