【问题标题】:Assigning to 'NSUInteger *' (aka 'unsigned long *') from incompatible type 'const uint8_t *const' (aka 'const unsigned char *const')从不兼容的类型'const uint8_t *const'(又名'const unsigned char *const')分配给'NSUInteger *'(又名'unsigned long *')
【发布时间】:2013-02-08 15:38:35
【问题描述】:

我对目标 c 编程比较陌生,所以请不要因为这个问题杀了我。 目前我正在开发一个小程序,它应该能够对 mp4 文件的 id3 标签进行一些更改。我已经植入了 mp4v2 库,现在我正在尝试编写一种方法来读取特定文件的标签信息。 我的问题是我无法将标签“contentRating”的值放入 NSUInteger 变量中。该库的引用说我得到了这样的值:“const uint8_t *”。 但是我怎样才能把它放到 NSUInteger 变量中呢? 非常感谢您提前提供的帮助!

这是我的代码:

- (void)getSongInfo:(NSString *)path
          title:(NSString *)t
          album:(NSString *)alb
         artist:(NSString *)art
         rating:(NSUInteger *)r
       albumart:(NSData *)aArt {

// Transform path in const char
const char *cPath = [path cStringUsingEncoding:NSASCIIStringEncoding];

// Load File
MP4FileHandle mp4File = MP4Modify(cPath);

// Create Tag var
const MP4Tags* tags = MP4TagsAlloc();

// Get Tags
MP4TagsFetch(tags, mp4File);

// Get Titel + Album + Interpret + Rating
t = [NSString stringWithUTF8String:tags->name];
alb = [NSString stringWithUTF8String:tags->album];
art = [NSString stringWithUTF8String:tags->artist];

r = tags->contentRating; <-- My Problem!

【问题讨论】:

  • 您知道这不会修改talbartraArt?在 C 中,参数总是按值传递。
  • 正如我所说,我完全是个菜鸟。那我该怎么办?我需要为其他方法取回所有值吗?
  • 您传递指针并取消引用它们。谷歌“C 指针传递”。
  • 我会看看我能找到什么。到目前为止谢谢;)

标签: objective-c variables methods


【解决方案1】:

你可以这样做:

- (void)getSongInfo:(NSString *)path
      title:(NSString **)t
      album:(NSString **)alb
     artist:(NSString **)art
     rating:(NSUInteger *)r
   albumart:(NSData **)aArt {

 ...

// Get Titel + Album + Interpret + Rating
*t = [NSString stringWithUTF8String:tags->name];
*alb = [NSString stringWithUTF8String:tags->album];
*art = [NSString stringWithUTF8String:tags->artist];

*r = (NSUInteger)(*tags->contentRating); <-- My Problem!

你可以这样称呼这段代码:

NSString* title = nil;
NSString* album = nil;
NSString* artist = nil;
NSUInteger rating = 0;
NSData* albumArt = nil;

[self getSongInfo:path title:&title album:&album artist:&artist rating:&rating albumArt:&albumArt];

尊重你的代码,我的代码包含两种变化:

  1. 参数通过引用传递(因此您可以将值“传回”给调用者);

  2. *contentRating 被转换为正确的类型(因为 NSUInteger 大于 uint8_t,所以这个转换不会出现任何问题。

另一方面,我强烈建议创建一个类来保存有关歌曲的信息:

@interface MP3Info : NSObject
@property (nonatomic, retain) NSString* title;
...
@end

然后重新声明您的方法,例如:

- (MP3Info*)getSongInfo:(NSString *)path;

希望对你有帮助。

【讨论】:

  • 感谢塞尔吉奥,你帮了我很多。别担心,我已经为信息创建了一个类。我只需要一种方法来获取创建对象的值。
  • 嗯,我只是想知道我对函数的更改是否正确。所以我将链接发布到我上传代码的 Pastbin ;)
  • 抱歉,没有看到链接...您的功能似乎还可以;如果你想让你的方法更短,你可以保留局部变量并直接将正确的值传递给 init 方法......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多